如何将函数应用于特定目录中的一组.csv文件?

时间:2017-08-29 12:14:50

标签: r dataframe lapply

尽管使用lapply进行了大量研究和一些努力(我认为/希望这是正确的apply函数),但我无法实现以下目标并希望得到一些指导。我想要做的是读入单个目录中的所有文件,将它们全部合并到一个数据帧中,确保每个文件在合并之前删除了前七行。

(请注意,所有文件都包含相同的列标题并包含相同的数据类型。)

我试过这个,但它显然没有达到我想要实现的一切:

files <- list.files(pattern = "*.csv") # Gather a list of everything in the directory that is a .csv file.
aconex <- lapply(files, fread) # Use lapply (I think this is correct) to apply the fread() function (from the data.table package) to each .csv file

这导致所有内容都存储在向量中,而我希望输出为数据帧。

必须有更好的方法 - 我似乎无法弄明白。

有人能提出更好的解决方案吗?

更新

或者,我写了一个for循环,它部分实现了我想要的东西;问题是它只将一个文件的数据保存到数据框中(总共有15个文件):

for(x in list.files(pattern = "*.csv")){
  df <- data.table::fread(x)
  df <- df[-(1:7), ]
  colnames(df) <- as.character(unlist(df[1,]))
  df <- df[-(1), ]
}

删除前七行后,我将第一行应用为列名,然后删除第一行。再说一次,实现这一目标的更好方法是什么?

理想情况下,我希望结果输出为x个数据帧(df1df2,..,dfX)然后我可以合并它们,但是,再次,必须有一个更好的方法 - 它是什么?

简单地说,我希望将每个文件读入自己的数据框,然后将row 8的值用作列标题,然后删除前八行(我只保留第八行)为了在删除之前将其用于列标题)。

1 个答案:

答案 0 :(得分:1)

这可以通过创建anonymous function来完成,该{{3}}使用read.csv进行读取,然后使用skip参数删除前七行。然后,您可以将所有data.framedo.call一起粘贴。

files <- list.files(pattern = "*.csv")

#create f, which is a list of data frames
f <- lapply(files, function(m) df <- read.csv(m, skip = 7, header = TRUE))

#stick them all together with do.call-rbind
f_combine <- do.call("rbind", f)

如果确实需要data.table::fread提供的速度,您可以按如下方式修改代码:

#create f, which is a list of data frames; modified with fread from data.table
f <- lapply(files, function(m) df <- fread(m, skip = 7))

#use rbindlist this time
f_combine <- rbindlist(f )