【问题标题】:Merge multiple data frames with partially matching rows合并具有部分匹配行的多个数据框
【发布时间】:2019-03-13 22:32:52
【问题描述】:

我有包含诸如名称等元素列表的数据框。数据框中有不同的名称,但大多数都匹配在一起。我想将所有这些组合在一个列表中,我将在其中查看任何 df.

df1 的数据样本:

  X                    x
1 1 rh_Structure/Focus_S
2 2 rh_Structure/Focus_C
3 3 lh_Structure/Focus_S
4 4 lh_Structure/Focus_C
5 5   RH_Type-Function-S
6 6        RH_REFERENT-S

对于 df2

  X                    x
1 1 rh_Structure/Focus_S
2 2 rh_Structure/Focus_C
3 3 lh_Structure/Focus_S
4 4 lh_Structure/Focus_C
5 5            UCZESTNIK
6 6                COACH

预期的结果是:

                  NAME. df1 df2
1                COACH  NA   6
2 lh_Structure/Focus_C   4   4
3 lh_Structure/Focus_S   3   3
4        RH_REFERENT-S   6  NA
5 rh_Structure/Focus_C   2   2
6 rh_Structure/Focus_S   1   1
7   RH_Type-Function-S   5  NA
8            UCZESTNIK  NA   5

我可以使用 merge.data.frame(df1,df2,by = "x", all=T), 但是我不能用更多具有类似结构的df来做到这一点。任何帮助将不胜感激。

【问题讨论】:

  • 使用merge*_join有什么问题?只是您想合并两个以上的数据框吗?如果是这样,请查看Reducepurrr::reduce

标签: r


【解决方案1】:

使用长格式可能会更容易。只需rbind 将所有数据集彼此下方,并带有它们来自哪个数据集的标志。然后获得所有缺失值的列表相对简单(并且作为额外的奖励,您可以查看在任何源数据集中是否有任何重复项):

dfs <- c("df1","df2")
dfall <- do.call(rbind, Map(cbind, mget(dfs), src=dfs))
table(dfall$x, dfall$src)

#                        df1 df2
#   COACH                  0   1
#   lh_Structure/Focus_C   1   1
#   lh_Structure/Focus_S   1   1
#   RH_REFERENT-S          1   0
#   rh_Structure/Focus_C   1   1
#   rh_Structure/Focus_S   1   1
#   RH_Type-Function-S     1   0
#   UCZESTNIK              0   1

【讨论】:

  • 谢谢,但老实说,我的循环不能正常工作,你能帮我写一个吗?所有文件均为 csv 格式,内容相同,但我无法将它们收集为数据框并按照您的建议进行处理。上面的解决方案很好。我只需要循环它或应用于所有 csv 文件以生成一个数据框,其中包含第一列中有关名称的所有数据。数据说 1 o 0,所以名称存在与否。
  • 但是,我将这些文件中的所有数据一个接一个地收集在一个列表中。我不知道这是否有帮助。
猜你喜欢
  • 1970-01-01
  • 2016-10-11
  • 2021-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多