【问题标题】:Merging different size multiple csv files合并不同大小的多个csv文件
【发布时间】:2015-02-23 10:22:52
【问题描述】:

请帮助我编写一个代码,在 R 中使用所有文件中的公共字段组合多个 csv 文件(但每个文件的行数不同,如 702、666 等),对于缺失值,我需要 NA代替缺失值。

为了便于理解,这里我展示的是单个文件的外观,因为这里我无法附加多个文件。我只是贴一个。 name 是所有文件中的通用文件。以文件名作为其标题以及其列名。

    name   projected_leaf_area  treatment  species      g_alias     replicates
1   A-2:1   215.209             WW       Chickpea  ICCRIL03-0013    2
2   A-2:2   148.404             WW       Chickpea  ICCRIL03-0119    2
3   A-2:3   206.566             WW        Chickpea ICCRIL03-0007    2
.  .. .  . .  ... ........  ......
 .  .. .  . .   ... ........  ...... 
702 B-2:234 242.06              WW        Chickpea ICCRIL03-0143    4

请帮我合并文件朋友...感谢您的时间...

【问题讨论】:

  • 请正确格式化您的问题。大写的文字在网上有特定的含义,就是你在喊!所以请不要仅仅使用它来突出某些句子,而是使用粗体或斜体文字。
  • 对不起,下次我不会使用它了。我想只是突出显示它,但以后我会使用粗体或斜体...谢谢你,对不起...
  • 请让您的问题可重现。在 cmets 中聊天不是要走的路。
  • @RomanLuštrik 先生,但如何公开讨论?对于他们的回答,这是我应该如何回答的正确方式???或者如果有任何其他方式我很乐意使用...
  • 在我看来,cmets 是为了澄清不应该出现在主要问题中的事情。我认为答案无法为您提供开箱即用的解决方案是因为您的问题不够清楚。请不要感到被冒犯,考虑我的评论并采取行动。

标签: r csv


【解决方案1】:

使用read.csvmerge 将所有文件一起使用Reduce 加载:

files <- dir(pattern = ".csv")
d <- lapply(files, read.csv, stringsAsFactors = FALSE)
for(i in seq_along(d)) {
    names(d[[i]]) <- paste0(files[i], ".", names(d[[i]]))
}
Reduce(function(x,y) merge(x,y,by="name", all=TRUE, sort = FALSE), d)

【讨论】:

  • 非常感谢您抽出宝贵的时间,Thomas... 但它正在将所有 csv 文件向下(垂直)组合起来。我想与公共字段水平组合。请问??????
  • 您必须详细说明。您可能想使用merge(或者cbind)而不是rbind,但这取决于您希望如何组合行。
  • Thomas 不同大小的行 cbind 不能用对吗???如果我尝试使用 merge , files
  • 所以在我需要的组合输出中,如 s5.projected_leaf_area, s5.treatment ,s5.species ,s5.g_alias, s5.replicates, s6.projected_leaf_area s6.treatment s6.species s6.g_alias s6.replicates 等等..我总共有50个文件..列字段名称在所有文件中都是通用的..希望现在我解释清楚了..期待您的回复...
  • 当我运行最后一行(减少)时,会出现以下错误, fix.by(by.x, x) 中的错误:'by' 必须指定唯一有效的列调用方:停止(ngettext(sum(bad), "'by' 必须指定唯一有效的列", "'by' 必须指定唯一有效的列"), domain = NA) Browse[1]> 我在此期间再次遇到上述错误新的 cose 对不起...它要求我通过“fix.by”进行调试.....请问如何解决这个问题...???
【解决方案2】:
file.data <- lapply(file.names, function(fn){read.csv(fn)})    
common.cols <- Reduce('intersect', lapply(file.data, colnames))
do.call('rbind', lapply(file.data, function(fd) fd[, common.cols]))
#

忽略以上 试试

mergeall <- function(x, y){merge(x, y, all = TRUE)}
file.data <- lapply(file.names, function(fn){read.csv(fn)})
# example data:
# file.data[[1]] <- data.frame(id = letters[1:4], val1 = 1:4)
# file.data[[2]] <- data.frame(id = letters[1:3], val2 = c(1, NA, 2))
# file.data[[3]] <- data.frame(id = letters[2:5], val3 = factor(letters[1:4]))
Reduce('mergeall', file.data)
#   id val1 val2 val3
# 1  a    1    1 <NA>
# 2  b    2   NA    a
# 3  c    3    2    b
# 4  d    4   NA    c
# 5  e   NA   NA    d

【讨论】:

  • 非常感谢您抽出宝贵的时间 Russ... 但它显示文件名未找到的错误???请问你能说出原因吗???
  • 您需要将 file.names
  • Natty 你能详细说明一下吗...抱歉我没明白你的意思。我是这个 r 编程环境的新手。我的文件名会像 s6、s7、s8、s9、 .....s50
  • 这类似于@Thomas 对它们的定义files &lt;- dir(pattern = ".csv")
  • Russ,我在源代码查看器中遇到错误,因为 (lapply 调试),函数 (X, FUN, ...) { FUN
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-02
  • 1970-01-01
  • 2018-11-16
  • 2021-10-04
  • 2021-03-13
  • 2018-08-07
  • 2013-07-19
相关资源
最近更新 更多