是否可以将多个数据帧存储到一个数据结构中,然后由每个数据帧处理?即示例
df1 <- data.frame(c(1,2,3), c(4,5,6))
df2 <- data.frame(c(11,22,33), c(44,55,66))
..然后我想在数据结构中添加它们,这样我就可以遍历该数据结构,一次检索一个数据帧并进行处理,如
for ( iterate through the data structure) # this gives df1, then df2
{
write data frame to a file
}
我在R中找不到任何这样的数据结构。任何人都可以指出任何代表相同功能的代码吗?
答案 0 :(得分:12)
只需将data.frames
放入列表中即可。一个加号是list
与apply
样式循环非常适用。例如,如果要保存data.frame,可以使用mapply
:
l = list(df1, df2)
mapply(write.table, x = l, file = c("df1.txt", "df2.txt"))
如果你喜欢apply
样式循环(你会信任我:),请看一下史诗plyr
包。它可能不是最快的包(快速查看data.table
),但它含有语法糖。
答案 1 :(得分:8)
列表几乎可用于保存任何内容,包括data.frame
s:
## Versatility of lists
l <- list(file(), new.env(), data.frame(a=1:4))
为了写出存储在列表中的多个数据对象,lapply()
是你的朋友:
ll <- list(df1=df1, df2=df2)
## Write out as *.csv files
lapply(names(ll), function(X) write.csv(ll[[X]], file=paste0(X, ".csv")))
## Save in *.Rdata files
lapply(names(ll), function(X) {
assign(X, ll[[X]])
save(list=X, file=paste0(X, ".Rdata"))
})
答案 2 :(得分:5)
您要找的是list
。
您可以使用lapply
之类的函数以相同的方式处理每个数据框。但是,在某些情况下,您可能需要将数据框列表传递给处理相互关联的数据框的函数。在这种情况下,lapply
对您没有帮助。
这就是为什么重要的是要注意如何访问和迭代列表中的数据框。它是这样做的:
mylist[[data frame]][row,column]
请注意数据框索引周围的双括号。 因此,对于您的示例,它将是
df1 <- data.frame(c(1,2,3), c(4,5,6))
df2 <- data.frame(c(11,22,33), c(44,55,66))
mylist<-list(df1,df2)
mylist[[1]][1,2]
将返回4,而mylist[1][1,2]
将返回NULL。我花了一段时间才找到这个,所以我觉得在这里发帖可能会有所帮助。