【问题标题】:Read and rbind multiple csv files读取并绑定多个 csv 文件
【发布时间】:2014-07-22 14:54:26
【问题描述】:

我有一系列具有相同列标题和不同行数的 csv 文件(每年一个)。最初我正在阅读它们并像这样合并它们;

setwd <- ("N:/Ring data by cruise/Shetland")
LengthHeight2013 <- read.csv("N:/Ring data by      cruise/Shetland/R_0113A_S2013_WD.csv",sep=",",header=TRUE)
LengthHeight2012 <- read.csv("N:/Ring data by cruise/Shetland/R_0212A_S2012_WD.csv",sep=",",header=TRUE)
LengthHeight2011 <- read.csv("N:/Ring data by cruise/Shetland/R_0211A_S2011_WOD.csv",sep=",",header=TRUE)
LengthHeight2010 <- read.csv("N:/Ring data by cruise/Shetland/R_0310A_S2010_WOD.csv",sep=",",header=TRUE)
LengthHeight2009 <- read.csv("N:/Ring data by cruise/Shetland/R_0309A_S2009_WOD.csv",sep=",",header=TRUE)

LengthHeight <- merge(LengthHeight2013,LengthHeight2012,all=TRUE)
LengthHeight <- merge(LengthHeight,LengthHeight2011,all=TRUE)
LengthHeight <- merge(LengthHeight,LengthHeight2010,all=TRUE)
LengthHeight <- merge(LengthHeight,LengthHeight2009,all=TRUE)

我想知道是否有更短/更整洁的方法来执行此操作,同时考虑到每次运行脚本时我可能想查看不同的年份范围。

我还发现了 Tony Cookson 的这段代码,看起来它可以满足我的需求,但是它为我生成的数据帧只有正确的标题,但没有数据行。

multmerge = function(mypath){
filenames=list.files(path=mypath, full.names=TRUE)
datalist = lapply(filenames, function(x){read.csv(file=x,header=T)})
Reduce(function(x,y) {merge(x,y)}, datalist)

mymergeddata = multmerge("C://R//mergeme")

【问题讨论】:

  • 你真的需要合并吗? do.call(rbind, datalist) 呢?
  • sep=",",header=TRUEread.csv() 的默认值。

标签: r csv data-binding merge dataframe


【解决方案1】:

查找文件 (list.files) 并循环读取文件 (lapply),然后调用 (do.call) 行绑定 (rbind) 将所有文件按行放在一起。

myMergedData <- 
  do.call(rbind,
          lapply(list.files(path = "N:/Ring data by cruise"), read.csv))

更新: 有一个 vroom 包,according to the manuals 它比 data.table::fread 和 base 快得多>read.csv。语法看起来也很简洁:

library(vroom)
myMergedData <- vroom(files)

【讨论】:

  • 我有类似的问题并使用: zoneB = list.files(pattern="*.csv") for (i in 1:length(zoneB)) assign(zoneB[i], read. csv(zoneB[i])) 然后 ZB = lapply(zoneB, read_csv) %>% bind_rows() ......但我想知道有没有办法排除列表中的特定 .csv 文件?
  • 如果我需要将参数传递给lapply上的函数怎么办?例如。而不是 read.csv 我想使用 read.table 并在上面设置一些选项。
  • 嘿 zx8754 - 谢谢!有没有办法在文件夹的每个文档上保留一个 ID?
  • @MelaniaCB 当然可以,请参考这篇文章提出一个新问题,并提供示例输入和预期输出。
【解决方案2】:

如果您正在寻找速度,那么试试这个:

require(data.table) ## 1.9.2 or 1.9.3
ans = rbindlist(lapply(filenames, fread))

【讨论】:

    【解决方案3】:

    没有足够的代表发表评论,但要回答 Rafael Santos,您可以使用此处的代码将参数添加到上述答案中的 lapply。 Using lapply and read.csv on multiple files (in R)

    【讨论】:

      猜你喜欢
      • 2021-02-20
      • 2015-05-23
      • 2016-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-19
      • 1970-01-01
      相关资源
      最近更新 更多