我必须有两个数据框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
我必须根据两个数据框中colB
的匹配,使用数据框colB
中df_a
的值更新colA
。
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
输出不会提供多个匹配元素(不出意外!)。例如,10
有两个值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%
来完成任务?
答案 0 :(得分:2)
你需要aggregate
到paste
个相同的匹配,然后合并,即。
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
答案 1 :(得分:2)
如果您希望按原始顺序df_b
,我会使用data.table
,如下所示:
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"]
将其结果与df_b
合并。
结果是:
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