我在路径path
中有一堆.csv文件,我使用以下代码将其导入到名为datalist
的数据帧列表中:
require(gsubfn) ## to use strapply
datalist <- list()
files <- list.files(path)
for(file in files) {
stem <- gsub("\\.csv$","",file)
datalist[[stem]] <- data.frame(read.delim(file, sep = ";", header=TRUE))
month <- strapply(stem,"^([^_]*).*$")
year <- strapply(stem,"^[^_]*_([^_]*)_.*$")
datalist[[stem]]$Month <- month
datalist[[stem]]$Year <- year
}
(正如您可能已经注意到的那样,我也会使用两个正则表达式来获取数据引用的月份和年份,但这不会导致我稍后遇到的问题。)
然后,我使用merged
包中的rbind
函数将所有数据帧行绑定到名为plyr
的单个数据帧中:
require(plyr) ## to use rbind
merged <- rbind.fill(datalist)
我的问题是我最终得到的数据框似乎是一个奇怪的列表数据框:实际上,如果我尝试将其导出为.csv格式,R会抛出以下错误:
write.csv(merged,'merged.csv')
Error in write.table(x, file, nrow(x), p, rnames, sep, eol, na, dec, as.integer(quote),:
unimplemented type 'list' in 'EncodeElement'
如果我尝试使用melt
包中的cast
和reshape
函数重构数据框,则会向我发出另一个类似的错误:
require(reshape) ## to use melt and cast
molten <- melt(merged)
cast <- cast(molten, ...formula...)
Error in order(var1 = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, :
unimplemented type 'list' in 'listgreater'
那么,我怎样才能从数据帧列表中获取正常的数据帧?我认为问题出在“导入”过程中,因为即使我尝试将unimplemented type 'list' in 'EncodeElement'
列表中的一个数据帧导出到.csv,也会向我抛出同样的错误datalist
。
非常感谢。
答案 0 :(得分:1)
我刚刚在http://www.r-bloggers.com/concatenating-a-list-of-data-frames/遇到了这个问题的新解决方案。 data.table
包中包含一个名为rbindlist()
的函数,它将(引自the docs)获取“包含data.table,data.frame或list objects的列表”并将它们绑定到一个单独的data.frame,按位置或按名称匹配列。看起来你可以通过
install.packages("data.table")
library(data.table)
merged<-rbindlist(datalist,use.names=TRUE)
rbindlist()
显然是用C而不是R编写的,根据上面链接的r-bloggers.com文章,它比plyr库有明显的速度优势。
答案 1 :(得分:0)
只要列表中的所有data.frames具有相同的标题,您就可以使用plyr。
library(plyr)
dat <- ldply(your_list)
例如:
dat <- data.frame(A=1:10,B=rnorm(10))
alistofdataframes <- list()
alistofdataframes$group1 <- dat
alistofdataframes$group2 <- dat
ldply(alistofdataframes)