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

nam*_*ked 13 r dataframe

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

df1 <- data.frame(c(1,2,3), c(4,5,6))
df2 <- data.frame(c(11,22,33), c(44,55,66))
Run Code Online (Sandbox Code Playgroud)

..然后我想在数据结构中添加它们,这样我就可以遍历该数据结构,一次检索一个数据帧并进行处理,类似于

 for ( iterate through the data structure) # this gives df1, then df2
 {
    write data frame to a file
}
Run Code Online (Sandbox Code Playgroud)

我在R中找不到任何这样的数据结构.任何人都可以指出任何代表相同功能的代码吗?

Pau*_*tra 12

把它data.frames放在一个列表中.一个优点是,它listapply样式循环的效果非常好.例如,如果要保存data.frame,可以使用mapply:

l = list(df1, df2)
mapply(write.table, x = l, file = c("df1.txt", "df2.txt"))
Run Code Online (Sandbox Code Playgroud)

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


Jos*_*ien 8

列表可用于保存几乎任何内容,包括data.frames:

## Versatility of lists
l <- list(file(), new.env(), data.frame(a=1:4))
Run Code Online (Sandbox Code Playgroud)

为了写出存储在列表中的多个数据对象,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"))
})
Run Code Online (Sandbox Code Playgroud)


Owl*_*ght 5

你要找的是一个list.您可以使用类似于lapply以相同方式处理每个数据框的函数.但是,在某些情况下,您可能需要将数据框列表传递给处理相互关联的数据框的函数.在这种情况下lapply没有帮助你.

这就是为什么重要的是要注意如何访问和迭代列表中的数据框.它是这样完成的:

mylist[[data frame]][row,column]
Run Code Online (Sandbox Code Playgroud)

请注意数据框索引周围的双括号.所以对于你的例子来说就是这样

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)
Run Code Online (Sandbox Code Playgroud)

mylist[[1]][1,2]将返回4,而mylist[1][1,2]将返回NULL.我花了一段时间才找到这个,所以我觉得在这里发帖可能会有所帮助.