【问题标题】:R - Can not merge a CSV, for some reasonR - 由于某种原因,无法合并 CSV
【发布时间】:2012-06-25 21:45:18
【问题描述】:
> imqd = read.csv("csv/quest/IMQ.csv")
> demod = read.csv("csv/DEMO.csv")
> mcqd = read.csv("csv/quest/MCQ.csv")
> 
> length(demod)
[1] 145
> length(demod[[1]])
[1] 9965
> length(mcqd)
[1] 168
> length(mcqd[[1]])
[1] 9493
> length(imqd)
[1] 5
> length(imqd[[1]])
[1] 9965
> 
> mydata = merge(imqd, demod)
> length(mydata)
[1] 148
> length(mydata[[1]])
[1] 9965

到目前为止,一切都很好。但是,如果我尝试将 mcqd 与任何东西合并,我会丢失大部分行,即使数据对我来说看起来不错。

> intersect(intersect(names(imqd), names(mcqd)), names(demod))
[1] "X"    "seqn"

> finaldata = merge(mydata, mcqd)
> length(finaldata)
[1] 314
> length(finaldata[[1]])
[1] 18

为什么现在只有 18 行?

如果你想在家一起玩,可以get the csv files here

【问题讨论】:

  • 我认为merge 可能并不像您认为的那样。默认情况下,它会对所有匹配的列进行内连接。任何不匹配的东西都会被丢弃,就像在 sql 中一样。您可能想要调查 byall 参数。
  • 所有三个文件都有两列几乎完全相同。

标签: r csv statistics


【解决方案1】:

merge 试图只返回在每个公共列上匹配的行。 查看MCQ.csv,我们看到第20行开始了:

"19",20,2,NA,

merge 不会使用这一行。两个公共列,第一列和第二列,对于每个文件都不匹配。要合并的数据的pk 显然是seqn。因此,我们可以简单地将by 参数用于merge

> finaldata = merge(mydata, mcqd, by="seqn")

【讨论】:

  • 正如我所怀疑的,您只需要非常仔细地查看第一列/第二列中的值。特别是,请查看 MCQ。值 19 被跳过,这意味着对于所有剩余的值,它与其他值不同。
  • 更重要的是,加入时包含行号列会导致问题。
  • 看准了,如果你愿意,可以给我一个答案让我接受;而且,我会删除这个。
  • 没有必要,只需将其编辑到您的问题中即可。我不需要更多的代表。
  • 您可能希望使用read.csv(..., row.names=1) 正确读取行名(而不是进入列X)。然后合并可能会在不指定密钥的情况下工作(尽管这样做可能不是一个坏主意)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-05
  • 2023-03-15
  • 2015-09-30
  • 2013-12-28
  • 1970-01-01
相关资源
最近更新 更多