【问题标题】:How to combine multiple .csv files in R?如何在 R 中合并多个 .csv 文件?
【发布时间】:2014-01-07 02:23:00
【问题描述】:

我有一个包含近 2,000 个 .csv 文件的目录。

每个文件具有以下结构(显示 500 行中的 4 行):

                       Date;QOF
1    2004-01-04 - 2004-01-10;9
2    2004-01-11 - 2004-01-17;11
3    2004-01-18 - 2004-01-24;13
4    2004-01-25 - 2004-01-31;13

“QOF”列也是 .csv 文件的名称,每个文件都有一个唯一的名称(例如“MSTF”、“XQS”等)。我希望将每个 .csv 文件中的这一列合并到到正在读取的第一个 .csv 文件,该文件还包含日期变量。换句话说,我想保留第一个文件中的所有列,只将所有其他 .csv 文件中的第二列合并到这个文件中。最终结果应该是这样的:

                    Date;QOF;MSTF;XQS
1    2004-01-04 - 2004-01-10;9;10;8
2    2004-01-11 - 2004-01-17;11;11;5
3    2004-01-18 - 2004-01-24;13;31;2
4    2004-01-25 - 2004-01-31;13;45;23

到目前为止,我已经尝试过:

filenames <- list.files()

do.call("cbind", lapply(filenames, read.csv, header = TRUE))

【问题讨论】:

  • 使用合并而不是 cbind。确保传入适当的参数。
  • @iShouldUseAName :您将如何在这里使用合并? “确保传递适当的参数”是什么意思?
  • 如果第一列Date在所有文件中都完全相同,那么我认为cbind是一个很好的方法。试试do.call(cbind, lapply(filenames, read.table, header = TRUE, row.names = 1, sep = ';'))
  • @flodel :谢谢,效果很好!假设目录中有一个文件,其中 Date 列的行数较少 - 我如何修改程序以不包含该文件?
  • 选择不同的数据结构。

标签: r csv


【解决方案1】:
mybig <- do.call( rbind, lapply( listfiles, function(nam){ 
                       cbind(name=nam, read.file(paste0(nam,".csv"), header=TRUE) )
                                                }
        )              )

未经测试。请注意,我故意没有遵循您建议的结构。我想不出一个更令人困惑的数据结构来使用。您可能正在考虑使用该格式进行输出,并且首先需要构建一个数据框,然后将其写入带有分号分隔符的文件。

【讨论】:

  • 您对如何包含仅包含文件的条件有建议,例如nrow=500,使用do.call(cbind, lapply(filenames, read.table, header = TRUE, row.names = 1, sep = ';'))?
  • 如果您要求包含 500 行或更多行的文件,那么您首先需要导入然后测试文件是否足够。系统没有可用于预限定文件的行数属性。我想你可以想出一个尺寸代理。看看:names( file.info(dir()) )
  • 另一种想法是使用像 'awk' 这样的系统实用程序来对文件进行预限定。我不是“awk”的常规用户,但我相信您可以获得适当文档的工作示例来提供行数,然后循环通过 dir()list.files()
  • 如果我想使用 date 变量作为“by”变量而不是 cbind 来合并这些文件,在处理 2,000 个 .csv 文件时是否有方便的方法来执行此操作?
  • 答案将取决于您没有描述的问题的特征,更重要的是没有用可重现的例子说明。了解所有文件中是否会出现相同的日期或是否会丢失某些数据至关重要。看来您想先构建一个 R 数据结构,然后将其输出为分号分隔的文件。您应该编辑此问题或发布一个新问题,以包含两个或三个测试失败,并且具有一定程度的复杂性以回答未解决的问题。
猜你喜欢
  • 2012-04-29
  • 1970-01-01
  • 2017-10-07
  • 2015-07-26
  • 2020-09-23
  • 1970-01-01
  • 2013-04-21
  • 2021-05-17
  • 2023-02-14
相关资源
最近更新 更多