この質問にはすでに答えがあります:
11 年前
に閉店しました。
重複の可能性:
リスト内の複数のデータ フレームを同時に結合します
data.frames の例:
df1 = data.frame(id=c('1','73','2','10','43'),v1=c(1,2,3,4,5)) <br>
df2 = data.frame(id=c('7','23','57','2','62','96'),v2=c(1,2,3,4,5,6)) <br>
df3 = data.frame(id=c('23','62'),v3=c(1,2)) <br>
注: ID は各 data.frame に対して一意です。結果の行列を次のようにしたいと考えています。
1 1 NA NA
2 3 4 NA
7 NA 1 NA
10 4 NA NA
23 NA 2 1
43 5 NA NA
57 NA 3 NA
62 NA 5 2
73 2 NA NA
96 NA 6 NA
この場合、3 つのデータセットのみを表示していますが、実際には少なくとも 22 個のデータセットがあるため、最後に nx(22+1) の行列が必要になります。ここで、n は 22 個のデータセットすべての ID の数です。
2 つのデータセットがある場合、必要なのはo 最初の列で ID を取得し、2 列目と 3 列目に値を入力します。値が存在しない場合は、代わりに NA を入力します。
これは解決策ではありませんが、@Matthew Plourde が述べていることへの追加です。 data.frame のリストを作成できます: df_list <- lagply(paste0("df",1:22), as.name)。
– ヴォイチェフ・ソバラ
2012 年 12 月 31 日 9:02
1
このスレッドは別のスレッドと重複している可能性がありますが、質問と回答の両方がより読みやすい方法で表示されています。
– バイオサイバーマン
2016 年 2 月 15 日 9:54
------------------------
それらをリストに追加し、Reduce でマージを使用します
Reduce(function(x, y) merge(x, y, all=TRUE), list(df1, df2, df3))
# id v1 v2 v3
# 1 1 1 NA NA
# 2 10 4 NA NA
# 3 2 3 4 NA
# 4 43 5 NA NA
# 5 73 2 NA NA
# 6 23 NA 2 1
# 7 57 NA 3 NA
# 8 62 NA 5 2
# 9 7 NA 1 NA
# 10 96 NA 6 NA
このより簡潔なバージョンを使用することもできます。
Reduce(function(...) merge(..., all=TRUE), list(df1, df2, df3))
17
13
+1 で削減します。この単純な例では、これは merge(merge(df1, df2, by='id', all=T), df3, by='id', all=T) と同等です。 。データ フレームを反復処理するループを使用できることは明らかですが、それはまさに Reduce が行うことです。
– マシュー・ランドバーグ
2012 年 12 月 31 日 2:40
4
Reduce が言語に含まれていることには感謝していますが、*apply 関数のように追加できるようにしてほしいと心から思います指定された関数の al 引数。 all=TRUE でマージを使用するためだけに関数定義を埋め込まなければならないのは嫌いです。
– マシュー・プルード
2012 年 12 月 31 日 2:48
2
(古い) reshape パッケージの merge_recurse と merge_all は、より便利な形式でこれを行うものを構築する方法についての適切なガイドです。
– ジョラン
2012 年 12 月 31 日 2:52
3
これらのデータ フレーム間で異なる ID を考慮する必要がある場合、関数を変更する方法を聞いてもいいですか?
– コンラッド
2015 年 7 月 6 日 15:45
4
この方法を試してみましたが、それぞれ 125 行のリストが 500 個あるため、非常に遅くなります。他に高速な方法はありますか
– ポーラ A. ファッター
2015 年 9 月 7 日 13:19