将多个数据帧存储到一个数据结构中 - R.

时间:2012-09-04 17:58:18

标签: r dataframe

是否可以将多个数据帧存储到一个数据结构中,然后由每个数据帧处理?即示例

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中找不到任何这样的数据结构。任何人都可以指出任何代表相同功能的代码吗?

3 个答案:

答案 0 :(得分:12)

只需将data.frames放入列表中即可。一个加号是listapply样式循环非常适用。例如,如果要保存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。我花了一段时间才找到这个,所以我觉得在这里发帖可能会有所帮助。