[解決済み] データフレームに新しい行を追加する、特定の行インデックスで、追加されない?
2022-04-23 12:23:08
質問
次のコードは、ベクトルとデータフレームを組み合わせたものです。
newrow = c(1:4)
existingDF = rbind(existingDF,newrow)
しかし、このコードは常にデータフレームの末尾に新しい行を挿入します。
データフレーム内の指定した位置に行を挿入するにはどうしたらよいでしょうか。例えば、データフレームが20行あるとすると、10行目と11行目の間に新しい行を挿入するにはどうすればよいでしょうか。
どのように解決するのですか?
ここでは、(往々にして遅くなりがちな)
rbind
を呼び出します。
existingDF <- as.data.frame(matrix(seq(20),nrow=5,ncol=4))
r <- 3
newrow <- seq(4)
insertRow <- function(existingDF, newrow, r) {
existingDF[seq(r+1,nrow(existingDF)+1),] <- existingDF[seq(r,nrow(existingDF)),]
existingDF[r,] <- newrow
existingDF
}
> insertRow(existingDF, newrow, r)
V1 V2 V3 V4
1 1 6 11 16
2 2 7 12 17
3 1 2 3 4
4 3 8 13 18
5 4 9 14 19
6 5 10 15 20
もしスピードが明瞭さよりも重要でないなら、@Simonの解決策はうまくいくでしょう。
existingDF <- rbind(existingDF[1:r,],newrow,existingDF[-(1:r),])
> existingDF
V1 V2 V3 V4
1 1 6 11 16
2 2 7 12 17
3 3 8 13 18
4 1 2 3 4
41 4 9 14 19
5 5 10 15 20
(インデックス
r
とは異なります)。
そして最後に、ベンチマークです。
library(microbenchmark)
microbenchmark(
rbind(existingDF[1:r,],newrow,existingDF[-(1:r),]),
insertRow(existingDF,newrow,r)
)
Unit: microseconds
expr min lq median uq max
1 insertRow(existingDF, newrow, r) 660.131 678.3675 695.5515 725.2775 928.299
2 rbind(existingDF[1:r, ], newrow, existingDF[-(1:r), ]) 801.161 831.7730 854.6320 881.6560 10641.417
ベンチマーク
いつも@MatthewDowleに指摘されるように、ベンチマークは問題の規模が大きくなるにつれてスケーリングを検討する必要があります。 それではどうぞ。
benchmarkInsertionSolutions <- function(nrow=5,ncol=4) {
existingDF <- as.data.frame(matrix(seq(nrow*ncol),nrow=nrow,ncol=ncol))
r <- 3 # Row to insert into
newrow <- seq(ncol)
m <- microbenchmark(
rbind(existingDF[1:r,],newrow,existingDF[-(1:r),]),
insertRow(existingDF,newrow,r),
insertRow2(existingDF,newrow,r)
)
# Now return the median times
mediansBy <- by(m$time,m$expr, FUN=median)
res <- as.numeric(mediansBy)
names(res) <- names(mediansBy)
res
}
nrows <- 5*10^(0:5)
benchmarks <- sapply(nrows,benchmarkInsertionSolutions)
colnames(benchmarks) <- as.character(nrows)
ggplot( melt(benchmarks), aes(x=Var2,y=value,colour=Var1) ) + geom_line() + scale_x_log10() + scale_y_log10()
Roland の解決策は非常によくスケールします。
rbind
:
5 50 500 5000 50000 5e+05
insertRow2(existingDF, newrow, r) 549861.5 579579.0 789452 2512926 46994560 414790214
insertRow(existingDF, newrow, r) 895401.0 905318.5 1168201 2603926 39765358 392904851
rbind(existingDF[1:r, ], newrow, existingDF[-(1:r), ]) 787218.0 814979.0 1263886 5591880 63351247 829650894
リニアスケールでプロットしたもの。
そして、log-logスケール。
関連
-
[解決済み] Pandas DataFrameの行数を取得する方法は?
-
[解決済み] データフレームの行を複数の列でソート(並び替え)する。
-
[解決済み] 既存のDataFrameに新しい列を追加する方法は?
-
[解決済み] 一行ずつ追加してPandas Dataframeを作成する
-
[解決済み] グループ化関数(tapply、by、aggregate)と*applyファミリ
-
[解決済み] 空のPandas DataFrameを作成し、それを埋める?
-
[解決済み] pandas series/dataframeの行を整数インデックスで選択する。
-
[解決済み] 重複するインデックスを持つpandasの行を削除する
-
[解決済み】2つの日付の間にあるDataFrameの行を選択する
-
[解決済み] データフレームの各行に対して、各行からの複数の引数でapplyのような関数を呼び出す
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
R 描画エラー plot.new() : 図形の余白が大きすぎる
-
二項演算子への非数値引数を報告するR言語エラー
-
R: エラー: $ 演算子は原子ベクトルに対して無効です。
-
Rの警告 "条件の長さが1より大きいので、最初の要素しか使えない "に対する解決策
-
[解決済み] Rでデータフレームに行を追加する方法は?
-
[解決済み] R および RStudio のコンソールをクリアする関数
-
[解決済み] R:自然対数を使った方程式をnlsで使う
-
[解決済み] R dataframeでNAの値をゼロに置き換えるには?
-
[解決済み] リストをデータフレームに変換する
-
[解決済み】RでCRANミラーを選択する方法