17

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

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

4

3 回答 3

15

只需将其data.frames放入列表中。一个优点是 alist非常适用于apply样式循环。例如,如果要保存 data.frame,可以使用mapply

l = list(df1, df2)
mapply(write.table, x = l, file = c("df1.txt", "df2.txt"))

如果你喜欢apply风格循环(你会的,相信我:))请看一下史诗plyr包。它可能不是最快的包(寻找data.table快),但它滴水的语法糖。

于 2012-09-04T18:01:23.677 回答
8

列表可以用来保存几乎任何东西,包括data.frames:

## 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"))
})
于 2012-09-04T18:13:15.950 回答
8

您正在寻找的是一个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。我花了一段时间才找到这个,所以我认为在这里发帖可能会有所帮助。

于 2014-08-28T09:50:33.250 回答