-1

我有一堆 .csv 文件位于path我导入到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如果我尝试使用包中的andcast函数来重塑数据框,则会向我抛出另一个类似的错误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

非常感谢。

4

2 回答 2

1

我刚刚在http://www.r-bloggers.com/concatenating-a-list-of-data-frames/遇到了这个问题的新解决方案。该data.table包包含一个名为的函数,该函数rbindlist()将(引用自文档)获取“包含 data.table、data.frame 或列表对象的列表”并将它们绑定到一个单独的 data.frame 中,按位置或按名称匹配列。看起来你可以得到你想要的东西

install.packages("data.table")
library(data.table)
merged<-rbindlist(datalist,use.names=TRUE)

rbindlist()显然是用 C 而不是 R 编写的,根据上面链接的 r-bloggers.com 文章,它比 plyr 库具有明显的速度优势。

于 2015-11-30T19:18:07.183 回答
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)
于 2012-12-02T19:05:22.063 回答