R数据框列表:无法导出或重塑

时间:2012-12-02 19:00:33

标签: r list dataframe

我在路径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包中的castreshape函数重构数据框,则会向我发出另一个类似的错误:

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

非常感谢。

2 个答案:

答案 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)