【问题标题】:How to retrieve multiple matching elements?如何检索多个匹配元素?
【发布时间】:2026-01-11 21:40:01
【问题描述】:

我有两个数据框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

我必须根据两个数据帧中colA 的匹配,使用数据帧df_a 中的colB 中的值更新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

输出不提供超过一个匹配的元素(不足为奇!)。例如,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% 来完成任务?

【问题讨论】:

  • 我会用merge(df_b, df_a, by = "colA", all.x = TRUE),但是colA == 10怎么办?
  • @m-dz 需要检索所有可能的匹配项
  • 那么,我评论中的代码是否符合您的预期?
  • @m-dz 是和否。我正在寻找可以嵌入为带有分隔符的单个值的解决方案。

标签: r dataframe match


【解决方案1】:

你需要将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

【讨论】:

    【解决方案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"]df_a 进行与@Sotos 提议的完全相同的聚合,然后[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
    

    【讨论】:

      最近更新 更多