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是和否。我正在寻找可以作为一个带分隔符的单个值嵌入的解决方案。