如何检索多个匹配元素?

时间:2016-09-15 12:18:28

标签: r dataframe match which

我必须有两个数据框df_adf_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的匹配,使用数据框colBdf_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有两个值IP但只提供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%来完成任务?

2 个答案:

答案 0 :(得分:2)

你需要aggregatepaste个相同的匹配,然后合并,即。

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