2017-10-26 13 views
1

私はこの形式の2つのデータフレーム2つのデータフレームを列ごとにマージします。 (2つのデータフレームの外にテーブルを作成する)

df1=data.frame(Date = c(1,2,3,4,5), customer1 = c(6,7,8,4,2), customer2 = 
c(2,3,6,5,3)...) 
df2=data.frame(Date = c(1,2,3,4,5), order1 = c(0,1,3,0,1), order2 = 
c(0,1,0,0,2)..) 

を持っている私は、日付の列と一緒に2つのデータフレームを絡み合った結果が欲しいです。

Date Customer1 Order1 Date Customer2 Order2 Date .... 
1  6  0  1  2  0  1 
2  7  1  2  3  1  2 
3  8  3  3  6  0  3 
4  4  0  4  5  0  4 
5  2  1  5  3  2  5 

私はforループをforループで使用しました。所望の結果を達成するためにcbindである。私はそれを行うためのより簡単で効率的な方法があるかどうかを知りたがっていました。

答えて

0

私たちは、列名のvectorを作成するために「日」欄でrbindorderに基づいたデータセットのnamesを取得し、その後、列の配列にorderを使用することができます。これは、完全なデータセット内の(cbind(df1, df2)

cbind(df1, df2)[c(rbind('Date', matrix(c(names(df1)[-1], 
     names(df2)[-1])[order(c(seq_along(df1)[-1], seq_along(df2)[-1]))], ncol=2)))] 
#  Date customer1 order1 Date.1 customer2 order2 
#1 1   6  0  1   2  0 
#2 2   7  1  2   3  1 
#3 3   8  3  3   6  0 
#4 4   4  0  4   5  0 
#5 5   2  1  5   3  2 

NOTEの列を注文するために使用することができます:データセット内の一意の列名を持つ方が良いです

0

次の解決策では、列の順序が同じではないか、日付が複数回表示されません。私は本当にどちらかの理由がたくさんあるとは思わないので、私は次の解決策を残しています。

データはユニークとし、そうでない場合はこの方法を使用しないものとします。

merge(df1, df2, key = date) 
# Date customer1 customer2 order1 order2 
# 1 1   6   2  0  0 
# 2 2   7   3  1  1 
# 3 3   8   6  3  0 
# 4 4   4   5  0  0 
# 5 5   2   3  1  2 
関連する問題