R 如何检索多个匹配元素?

R 如何检索多个匹配元素?,r,dataframe,match,R,Dataframe,Match,我必须有两个数据帧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

我必须有两个数据帧
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
输出不会给出多个匹配的元素(一点也不奇怪!)。例如,
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
预期输出(可能是类似这样的内容):
df_a[匹配(df_b$colA,df_a$colA),'colB']
#[1]I,PI,P E C E
#级别:C D E F I N P R S T

由于函数只返回第一个匹配的值,是否有其他替代方法,如%中的
哪个()
%in%
来完成任务?

您需要
聚合
粘贴
相同的匹配项,然后合并,即

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
merge(df_b,aggregate(colB~colA,df_a,paste,collapse=','),by='colA',all.x=TRUE)
#可乐瓶
#1     3 
#2     3 
#34 C
#47 E
#57E
#6     9 
#7     9 
#8     9 
#9 10 I,P
#10 I,P

您需要
聚合
粘贴
相同的匹配项,然后合并,即

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
merge(df_b,aggregate(colB~colA,df_a,paste,collapse=','),by='colA',all.x=TRUE)
#可乐瓶
#1     3 
#2     3 
#34 C
#47 E
#57E
#6     9 
#7     9 
#8     9 
#9 10 I,P
#10 I,P

如果您想按原始顺序使用
df_b
,我将使用
数据。表如下所示:

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
合并

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
结果是:

    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

如果您想按原始顺序使用
df_b
,我将使用
数据。如下表所示:

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
合并

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
结果是:

    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

我会使用
merge(df_b,df_a,by=“colA”,all.x=TRUE)
,但是如何处理
colA==10
?@m-dz需要检索所有可能的匹配项so,我的评论中的代码是否符合您的期望?@m-dz是和否。我正在寻找一个可以嵌入一个带分隔符的值的解决方案。我会使用
merge(df_b,df_a,by=“colA”,all.x=TRUE)
,但是如何处理
colA==10
?@m-dz需要检索所有可能的匹配项so,我的评论中的代码是否符合您的预期?@m-dz是和否。我正在寻找可以作为一个带分隔符的单个值嵌入的解决方案。