【问题标题】:How to merge two CSV files only on same column names如何仅在相同的列名上合并两个 CSV 文件
【发布时间】:2021-10-22 21:31:41
【问题描述】:

想象一下我有一个这样的数据框:

First <- data.frame(name=rep(c("Clay","Garrett","Addison"),each=3),
                   test=rep(1:3, 3),
                   score=c(78, 87, 88, 93, 91, 99, 90, 97, 91))

     name test score
1    Clay    1    78
2    Clay    2    87
3    Clay    3    88
4 Garrett    1    93
5 Garrett    2    91
6 Garrett    3    99
7 Addison    1    90
8 Addison    2    97
9 Addison    3    91

还有:

Second <- data.frame(name=rep(c("Jim","Jordan"),each=3),
                    test =rep(1:3, 2),
                    color = c("red", "brown", "red", "red", "blue", "green"))
    name    test color
1    Jim      1   red   
2    Jim      2 brown   
3    Jim      3   red   
4 Jordan      1   red   
5 Jordan      2  blue   
6 Jordan      3 green   

现在我想将第二个数据帧附加到第一个数据帧,这样我就有了:

     name test score
1    Clay    1    78
2    Clay    2    87
3    Clay    3    88
4 Garrett    1    93
5 Garrett    2    91
6 Garrett    3    99
7 Addison    1    90
8 Addison    2    97
9 Addison    3    91
10 Jim       1    NA
11 Jim       2    NA
12 Jim       3    NA
13 Jordan    1    NA
14 Jordan    2    NA
15 Jordan    3    NA

所以基本上像 LEFT JOIN 但列明智,所以我只保留第一个数据帧中的列,如果在第二个数据帧中找不到相同的列,我对该列的值有 NA

【问题讨论】:

  • 请不要转发或留下无关紧要的旧内容,只需在编辑时编辑到最好的演示文稿即可。 (删除的未投票的帖子仍计入发布限制。)如果“上面的示例不能真正代表我的数据集”,那么它不属于这里。但是初始化表格的代码也应该被格式化为表格,以便它可读。并且是最小的。像minimal reproducible example 的其余部分一样,它形成了。这应该是你能做的。 minimal reproducible example How to Ask Help center PS 这不清楚输出如何是输入的函数。 “asically”不会使不清楚的文本清晰。

标签: r dataframe join merge


【解决方案1】:

我们在这里可能需要bind_rows,即将第一个数据集('First')与'Second'绑定,两个数据集中只有intersect列名

library(dplyr)
bind_rows(First, Second[intersect(names(First), names(Second))])

-输出

      name test score
1     Clay    1    78
2     Clay    2    87
3     Clay    3    88
4  Garrett    1    93
5  Garrett    2    91
6  Garrett    3    99
7  Addison    1    90
8  Addison    2    97
9  Addison    3    91
10     Jim    1    NA
11     Jim    2    NA
12     Jim    3    NA
13  Jordan    1    NA
14  Jordan    2    NA
15  Jordan    3    NA

如果列类型不同,我们可能需要使列类型相同或使用rbindlist from data.table

library(data.table)
rbindlist(list(First,  Second[intersect(names(First), 
      names(Second))]), fill = TRUE)

【讨论】:

  • 感谢@akrun,如果列有不同的类型怎么办?例如,第一个数据框中的“测试”列 i 字符,而第二个数据框中的“数字”。
  • @Roozbeh_you 通过更改First$score &lt;- as.character(First$score) bind_rows 正在工作,即它将列转换为最终输出中的字符
  • 不幸的是,我刚刚发现24列的类型不一样!我的错!我的示例没有正确表示我在数据集中拥有的内容。感谢您的解决方案
  • @Roozbeh_你对这两种解决方案有任何错误吗?
  • 类型问题与源文件本身有关。即假设一个应该是数字的文件列有一个元素'x1.5'或$1.5,它不再是数字,而在其他文件中,你有1.5,这将被读取为数字
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-13
  • 2019-10-31
  • 1970-01-01
  • 2014-07-22
  • 2018-08-31
相关资源
最近更新 更多