2017-08-29 17 views
0

尽管大量的研究和使用lapply(我认为/希望这是正确的apply函数)的几个努力,我一直无法实现以下,并希望一些指导。我想要做的是读取单个目录中的所有文件,将它们全部合并到一个数据框中,确保每个文件在合并之前删除前七行。如何将函数应用于特定目录中的一组.csv文件?

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

我已经试过这一点,但它显然达不到的一切我想要实现:

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 

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

必须有更好的方法 - 我似乎无法弄清楚。

任何人都可以提出更好的解决方案吗?

UPDATE:

另外,我已经写了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的值用作列标题,然后删除前八行(我只保留第八行以便在删除它之前将它用于列标题)。

+0

取决于你想要做什么...'list_files <-list.files(模式(list_files,fread,skip = 7,header = T) result_dataframe <-do.call(list_result,“cbind”)'或'list_files <-list.files(pattern =“* .csv”)list_result < “* .csv”)list_result <-lapply(list_files,fread,skip = 7,header = T) result_dataframe <-rbindlist(list_results) – user3293236

回答

1

这可以通过创建一个anonymous function来完成,该函数用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) 
相关问题