根据按行分隔的名字和姓氏比较两个 Dataframe

zujrkrfu  于 2022-12-06  发布在  其他
关注(0)|答案(1)|浏览(114)

我有两个这样组织的 Dataframe 。

df1 <- data.frame(lastname = c("Miller", "Smith", "Grey"),
                  firstname = c("John", "Jane", "Hans")
                  )

df2 <- data.frame(lastname =c("Smith", "Grey"),
                  firstname = c("Jane", "Hans")
                  )

df2不一定是df1的子集。重复的条目也是可能的。
我的目标是保留一个df1的副本,其中所有的条目都在两个dfs中出现。或者,我想用一个新变量结束df1的子集,表明名称也是df2的元素。有人能建议一种方法来做到这一点吗?一个{dyplr}-尝试是完全可以的。
特定简单情况下的所需输出:

res <- data.frame(lastname = c("Smith", "Grey"), 
                  firstname = c("Jane", "Hans")
                 )
e0bqpujr

e0bqpujr1#

包括问题的“alternative”部分,这是一种left_join的方法。添加分组变量 grp 以区分2个集合。

library(dplyr)

left_join(cbind(df1, grp = "A"), cbind(df2, grp = "B"), 
  c("lastname", "firstname"), suffix=c("_A", "_B"))
  lastname firstname grp_A grp_B
1   Miller      John     A  <NA>
2    Smith      Jane     A     B
3     Grey      Hans     A     B

或以为底数Rmerge

merge(cbind(df1, grp = "A"), cbind(df2, grp = "B"), 
  c("lastname", "firstname"), suffixes=c("_A", "_B"), all=T)
  lastname firstname grp_A grp_B
1     Grey      Hans     A     B
2   Miller      John     A  <NA>
3    Smith      Jane     A     B

删除NA并压缩 grp

na.omit(left_join(cbind(df1, grp = "A"), cbind(df2, grp = "B"), 
    c("lastname", "firstname"), suffix=c("_A", "_B"))) %>% 
  summarize(lastname, firstname, 
    grp = list(across(starts_with("grp"), ~ unique(.x))))
  lastname firstname  grp
1    Smith      Jane A, B
2     Grey      Hans A, B

另一部分则是

merge(df1, df2)
  lastname firstname
1     Grey      Hans
2    Smith      Jane

相关问题