尽管使用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个数据帧(df1
,df2
,..,dfX
)然后我可以合并它们,但是,再次,必须有一个更好的方法 - 它是什么?
简单地说,我希望将每个文件读入自己的数据框,然后将row 8
的值用作列标题,然后删除前八行(我只保留第八行)为了在删除之前将其用于列标题)。
答案 0 :(得分:1)
这可以通过创建anonymous function来完成,该{{3}}使用read.csv
进行读取,然后使用skip
参数删除前七行。然后,您可以将所有data.frame
与do.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 )