【问题标题】:Matching the same rows in a data frame multiple times by order of match按匹配顺序多次匹配数据框中的相同行
【发布时间】:2020-12-27 09:16:15
【问题描述】:

我正在尝试通过将每一行中的值与另一个 data.frame 中的多个值进行匹配来尝试 data.frame 中的子集行。但是,我不只是想要一个匹配,我想要重复的匹配按照它们匹配的顺序重复该行。例如:

示例数据

df1 <- data.frame(a=c(1,2,3,4,5), b = c(1,1,2,3,4))
df2 <- data.frame(c=c(1,1,2,2,3,4,5,5,4,3), d=c(1,1,2,2,3,4,5,5,4,3))

df1:
a b
1 1
2 1
3 2
4 3
5 4

df2:
c d
1 1
1 1
2 2
2 2
3 3
4 4
5 5
5 5
4 4
3 3

由 a 和 c 匹配。这不会重复行

df1[df1[,1] %in% df2[,1],]

#Output
a b
1 1
2 1
3 2
4 3
5 4

#Desired output
a b
1 1
1 1
2 1
2 1
3 2
4 3
5 4
5 4
4 3
3 2

我觉得这应该很简单,但我似乎找不到其他答案。

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    我们可以使用简单的索引来复制base R中的行

    df1[df1$a[df2$c],]
    #    a b
    #1   1 1
    #1.1 1 1
    #2   2 1
    #2.1 2 1
    #3   3 2
    #4   4 3
    #5   5 4
    #5.1 5 4
    #4.1 4 3
    #3.1 3 2
    

    【讨论】:

    • 这并没有给我想要的输出。返回的唯一值应该来自 df1,而不是 df2。
    【解决方案2】:

    也许我们可以使用match

    df1[match(df2$c, df1$a), ]
    
    #    a b
    #1   1 1
    #1.1 1 1
    #2   2 1
    #2.1 2 1
    #3   3 2
    #4   4 3
    #5   5 4
    #5.1 5 4
    #4.1 4 3
    #3.1 3 2
    

    这很好用,因为df2c 列中的所有值都存在于df1a 列中。一般情况下,当c 中有一些不匹配的值时,它将返回NA,我们可以使用na.omit 将其删除。

    df1[na.omit(match(df2$c, df1$a)), ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多