如何在列表中分别保存data.frames?

时间:2013-12-28 07:25:54

标签: r list dataframe

这是我的问题。如果你能提供帮助,我们非常感谢。 我有一个列表,其中包含几个不同长度但结构相同的data.frames。 现在我想分别保存列表中的data.frames。 注意:不要将do.call(rbind,...)组合成一个data.frame。此外,我想命名数组中的每个data.frame。

a=c(1,2,3,4,5,6)

b=c(4,5,6,5,5,5)

c=c(3,4,5,6,7,8)

A=data.frame(a=a,b=b,c=c)

B=data.frame(a=c,b=b,c=a)

C=data.frame(a=b,b=c,c=a)

l <- list(A, B, C)

names.list <- c("NewYear_Data", "Thanks_giving", "Christmas")

现在我想使用names.list

中的名称将A B C保存在列表中

具体来说,这里有一个列表l,其中有几个data.frames。现在我想使用names.list中的名称保存列表l中的每个data.frames。

我尝试取消列表,获取并申请......

如果有人可以使用plyr,reshape或data.table方法解决这个问题,那就太棒了。

非常感谢!

4 个答案:

答案 0 :(得分:2)

这是解决方案

l <- list(A, B, C)
nms <- c("NewYear_Data", "Thanks_giving", "Christmas")
names(l) = nms

现在你可以使用这样的名字:

l$Christmas

如果您想要删除列表,请执行以下操作:

attach(l)
Christmas

将它们保存在二进制文件中:

save(list=nms,file='file.Rdata')

或在文本文件中:

for( i in 1:length(l))
  write.csv(l[i],paste0(nms[i],'.txt'))

注意避免调用变量names

答案 1 :(得分:2)

如果问题是“如何将数据框列表保存为文件夹中的单独文件?”,您可以尝试使用saveRDS而不是savesee here

names(l) <- names.list

lapply(names(l), function(df) 
  saveRDS(l[[df]], file = paste0(df, ".rds")))

list.files(pattern = ".rds")
[1] "Christmas.rds"     "NewYear_Data.rds"  "Thanks_giving.rds"

# To load an individual dataframe later 
df <- readRDS(file = "NewYear_Data.rds")

如果要使用save,则以下内容应该有效(see here;注意save保留变量名称,因此with语句和list =的使用)。

with(l, 
     lapply(names(l), function(df) 
       save(list = df, file = paste0(df, ".rda"))))

list.files(pattern = ".rda")
[1] "Christmas.rda"     "NewYear_Data.rda"  "Thanks_giving.rda"

否则,您可以将整个列表保存为单个文件

save(l, file = "Holidays.Rda")

答案 2 :(得分:1)

使用带有命名元素的单个列表几乎总是优于处理工作区中的大量对象。但是,实现目标可能方便的两个功能是setNames()list2env()。以下行将使用data.frame中的名称在您的全局环境中创建命名的names.list对象...

list2env( setNames( l , names.list ) , .GlobalEnv )

setNames()是一个便利函数,用于设置对象上的名称并返回该对象。 list2env()将指定列表中的每个元素分配到指定的环境中,最终得到3个data.frame个对象。

答案 3 :(得分:0)

运行代码后,我们有:

> ls()
[1] "a"          "A"          "b"          "B"          "c"          "C"         
[7] "l"          "names.list"

然后,您可以assign将{。}}数据框设置为names.list中的名称:

> invisible(mapply(function(x, y) assign(x, y, envir=globalenv()), names.list, l))
> ls()
[1] "a"             "A"             "b"             "B"             "c"            
[6] "C"             "Christmas"     "l"             "names.list"    "NewYear_Data" 
[11] "Thanks_giving"
> Christmas
a b c
1 4 3 1
2 5 4 2
3 6 5 3
4 5 6 4
5 5 7 5
6 5 8 6
> NewYear_Data
a b c
1 1 4 3
2 2 5 4
3 3 6 5
4 4 5 6
5 5 5 7
6 6 5 8

然后,如果要清理工作区并删除用于创建数据的内容,可以运行以下命令(小心,这将删除工作区中的所有内容,除了我们刚刚创建的数据框):

> rm(list=ls()[!(ls() %in% names.list)])
> ls()
[1] "Christmas"     "NewYear_Data"  "Thanks_giving"

坦率地说,我会推荐@ Andrey的答案,但是如果你真的希望让数据框在你的工作区中并摆脱你用来创建它的东西,那么这是一个选择。