【问题标题】:Merge two data frames in R and find common values and non-matching values合并R中的两个数据框并找到共同值和不匹配值
【发布时间】:2011-11-30 03:11:00
【问题描述】:

我试图找到一个函数来仅在一个公共列上匹配两个不同长度的数据帧,并创建一个不同的列来指定它是否找到匹配项。 所以,例如, df1 是:

Name Position location
francesca A 75
cristina B 36

而 df2 是:

location Country
75 UK
56 Austria

我想匹配“位置”,输出类似于:

Name Position Location Match
francesca A 75 1
cristina B 36 0

我已尝试使用函数match 或:

subset(df1, location %in% df2)

但它不起作用。

你能帮我弄清楚怎么做吗?

【问题讨论】:

    标签: r match dataframe


    【解决方案1】:

    试试:

    df1$match <- match(df1$location, df2$location, nomatch=0)
    

    这将向 df1 添加一列,指示 df2 中的哪一行与其匹配(仅考虑您指定的位置)。如果没有匹配,则返回零,所以你得到:

    > df1
           Name Position location match 
    1 francesca        A       75     1
    2  cristina        B       36     0
    

    请注意:如果第二个表中有多个匹配项,您可能需要使用不同的方法,因为此方法只返回第一个匹配项。由于您指定问题的方式,我认为这些是独一无二的,所以这应该不是问题。

    【讨论】:

    • 杰森 B,非常感谢。这样,我可以获得两个dfs中匹配的记录列表(如果匹配> 0),以及仅存在于df1中的记录列表(匹配== 0)。还有一个问题,您知道是否有一种简单的方法可以同时获得 df2 中不存在 df1 的记录列表?谢谢
    • 嗨@user971102 - 很高兴它对你有用(如果答案解决了你的问题,请接受它以便其他人知道)。要从 df2 获取不在 df1 中的记录,请尝试: df2[which(is.na(match(df2$location, df1$location))),] 或者,更直观地说,df2[-which(df2$location % in% df1$location),]
    • 对不起 Jason B,最后澄清一下...正如您所说,如果值不是唯一的,此方法将不起作用,我在开始时有一个额外的步骤来确保只有一个通过执行以下操作记录“位置”:df1_unique
    • @user971102-不用担心。 df1$match 在df2 中给出与df1 中的location 匹配的行。如果您只想要零和一,您可以添加一个步骤:df1$match&lt;-ifelse(df1$match&gt;0,1,0) 或者,使用逻辑可能会更好:df1$match=as.logical(df1$match)
    猜你喜欢
    • 2021-07-22
    • 2020-10-10
    • 1970-01-01
    • 2021-12-17
    • 2019-06-06
    • 2018-06-06
    • 1970-01-01
    • 2023-03-06
    相关资源
    最近更新 更多