【问题标题】:Merge csv files in R在 R 中合并 csv 文件
【发布时间】:2014-10-14 13:06:51
【问题描述】:

我有 3 个需要在 R 中分析的 .csv 文件。文件 1 包含带有用户 ID 和 signupdate 的列。文件二包含带有用户 ID、购买日期和购买金额的列。文件三包含带有用户 ID、消息日期和消息数量的列。

请注意,三个文件中用户id的顺序并不相同,因此是cop。

希望对合并这些文件有帮助,以便大型数据集包含订单用户 ID、签名更新、购买日期、购买数量、消息日期和消息数量。似乎无法在 R 中找到执行此操作的代码 提前致谢

【问题讨论】:

  • 我假设您知道如何分别阅读它们。发布一些sample data 是个好主意,这样更容易提供具体建议。
  • @MatthewLundberg:感谢您的纠正。可能会这样做: df=merge(df1,df2); df=merge(df,df3)
  • @rnso 当然。这就是Reduce 会做的事情。

标签: r csv merge


【解决方案1】:

虽然merge 不接受三个参数,但Reduce 用于迭代列表并将对传递给函数的任务。这是一个三向合并的示例:

d1 <- data.frame(id=letters[1:3], x=2:4)
d2 <- data.frame(id=letters[3:1], y=5:7)
d3 <- data.frame(id=c('b', 'c', 'a'), z=c(5,6,8))
Reduce(merge, list(d1, d2, d3))
##   id x y z
## 1  a 2 7 8
## 2  b 3 6 5
## 3  c 4 5 6

注意id列的顺序不一样,但值是matched。

如果您有不匹配的数据并希望保留所有可能的行,则需要通过将all=TRUE 提供给merge 来进行外连接。由于Reduce 没有办法向函数传递额外的参数,因此必须创建一个新函数来调用merge

d1 <- data.frame(id=letters[1:3], x=2:4)
d2 <- data.frame(id=letters[3:1], y=5:7)
d3 <- data.frame(id=c('b', 'c', 'd'), z=c(5,6,8))
Reduce(function(x,y) merge(x,y,all=TRUE), list(d1, d2, d3))
##   id  x  y  z
## 1  a  2  7 NA
## 2  b  3  6  5
## 3  c  4  5  6
## 4  d NA NA  8

NA 用于表示不匹配行中的数据。

【讨论】:

  • 您好,我刚刚玩过您的示例并有一个问题。我将 d3 中的一个 ID 从 a 更改为 d 并运行脚本。我没有在结果中看到 id a 和 d 的行。如果您想保留结果中的所有 id,我们该怎么办?
猜你喜欢
  • 1970-01-01
  • 2012-04-29
  • 2014-01-07
  • 2015-07-26
  • 2019-12-27
  • 2016-10-19
  • 2015-04-14
  • 1970-01-01
  • 2020-09-23
相关资源
最近更新 更多