1 つの大きなデータ フレームを 2 番目の同様のデータ フレームの内容で更新するための一般的な解決策を探しています。それぞれ数千行、10,000 列以上のデータセットが多数あります。「更新」データセットは、対応する「ベース」データセットと、行方向に数パーセントからおそらく 50 パーセントまでオーバーラップします。データセットには「キー」列があり、特定のデータセットの一意のキー値ごとに 1 つの行しかありません。
基本的なルールは、特定のセルの更新データセットに NA 以外の値が存在する場合、ベース データセットの同じセルをその値に置き換えることです。(「同じセル」とは、「キー」列と列名の値が同じであることを意味します。)
更新データセットには、rbind で処理できる新しい行 (「挿入」) が含まれる可能性が高いことに注意してください。
したがって、基本データ フレーム「df1」が与えられた場合、列「K」は一意のキー列であり、「P1」..「P3」は 10,000 列を表し、その名前はデータセットのペアごとに異なります。
K P1 P2 P3
1 A 1 1 1
2 B 1 1 1
3 C 1 1 1
...そして更新データフレーム「df2」:
K P1 P2 P3
1 B 2 NA 2
2 C NA 2 2
3 D 2 2 2
必要な結果は次のとおりです。「B」と「C」の 1 は 2 で上書きされましたが、NA では上書きされませんでした。
K P1 P2 P3
1 A 1 1 1
2 B 2 1 2
3 C 1 2 2
4 D 2 2 2
これはマージ候補ではないようです。マージにより、重複する行 (「キー」列に関して) または重複する列 (P1.x、P1.y など) が得られるため、何らかの形で折りたたむために反復する必要があります。 .
最終的な行/列の次元で行列を事前に割り当て、df1 の内容を入力してから、df2 の重複する行を反復処理しましたが、1 秒あたり 20 セル以上のパフォーマンスを得ることができず、何時間もかかりました(SAS の同等の DATA ステップの UPDATE 機能の数分と比較して)。
何かが欠けていると確信していますが、同等の例が見つかりません。
よく似た ddply の使用法が見られますが、一般的な解決策ではありません。これが結合の問題であることは明らかではないため、data.table
パッケージは役に立たなかったようです。少なくとも一般的には、非常に多くの列にまたがっています。
また、交差する行のみに焦点を当てたソリューションは、他の行を識別して rbind できるため、適切です。
上記のデータ フレームを作成するためのコードを次に示します。
cat("K,P1,P2,P3", "A,1,1,1", "B,1,1,1", "C,1,1,1", file="f1.dat", sep="\n");
cat("K,P1,P2,P3", "B,2,,2", "C,,2,2", "D,2,2,2", file="f2.dat", sep="\n");
df1 <- read.table("f1.dat", sep=",", header=TRUE, stringsAsFactors=FALSE);
df2 <- read.table("f2.dat", sep=",", header=TRUE, stringsAsFactors=FALSE);
ありがとう