2016-09-15 7 views
0

私は2つのデータフレームdf_a,df_bにする必要があります。一致する要素を複数取得するにはどうすればよいですか?

set.seed(143) 
df_a <- data.frame(colA = sample(1:10, 10, replace=T), colB = sample(LETTERS[1:20],10)) 
df_a 
# colA colB 
#1 10 I 
#2  1 D 
#3  8 R 
#4  5 F 
#5  1 N 
#6 10 P 
#7  7 E 
#8  6 S 
#9  6 T 
#10 4 C 

df_b <- data.frame(colA = sample(1:10, 10, replace=T)) 
df_b 
# colA 
#1  9 
#2  3 
#3  9 
#4  9 
#5  3 
#6 10 
#7 10 
#8  7 
#9  4 
#10 7 

Iは、両方のデータフレームにおけるcolAの照合に基づいてデータフレームdf_acolBの値でcolBを更新しなければなりません。

df_a[match(df_b$colA, df_a$colA),'colB'] 
# [1] <NA> <NA> <NA> <NA> <NA> I I E C E 
#Levels: C D E F I N P R S T 

出力に一致する要素が2つ以上ありません(驚きではありません)。例えば、10は、2つの値I,Pを有するが、Iを与えるに過ぎない。

Expected Output(something like this, maybe?): 

df_a[match(df_b$colA, df_a$colA),'colB'] 
# [1] <NA> <NA> <NA> <NA> <NA> I,P I,P E C E 
#Levels: C D E F I N P R S T 

match()機能のみ最初に一致した値を返すように、タスクを達成するためwhich()又は%in%ような任意の他の代替はありますか?

+1

私は ''(= "で、colA" によってdf_b、df_a、all.x = TRUE)をマージ使用しますが、 'で、colA == 10 'をどうしますか? –

+0

@ m-dz可能なすべての一致を検索する必要があります – Prradep

+0

私のコメントのコードは、あなたが期待していることですか? –

答えて

2

あなたが一緒にaggregatepasteに同じ一致する必要があり、あなたは次のように私はdata.tableを使用することになり、元の順序でdf_bを持つようにしたい場合は、すなわち、

merge(df_b, aggregate(colB ~ colA, df_a, paste, collapse = ','), by = 'colA', all.x = TRUE) 
# colA colB 
#1  3 <NA> 
#2  3 <NA> 
#3  4 C 
#4  7 E 
#5  7 E 
#6  9 <NA> 
#7  9 <NA> 
#8  9 <NA> 
#9 10 I,P 
#10 10 I,P 
2

をマージ:

library(data.table) 
setDT(df_b) 
setDT(df_a) 

df_a[, sapply(.SD, paste, collapse = ","), by = "colA"][df_b, , on = "colA"] 

まず、df_a[, sapply(.SD, paste, collapse = ",") , by = "colA"]は@Sotosが提案しているようにdf_aで全く同じ集約を実行しており、その後[df_b, , on = "colA"]はとその結果をマージしています。

結果は次のとおりです。

colA V1 
1: 9 NA 
2: 3 NA 
3: 9 NA 
4: 9 NA 
5: 3 NA 
6: 10 I,P 
7: 10 I,P 
8: 7 E 
9: 4 C 
10: 7 E 
関連する問題