使用 R 将列表的元素保存为 data.frames

Posted

技术标签:

【中文标题】使用 R 将列表的元素保存为 data.frames【英文标题】:Saving elements of a list as data.frames using R 【发布时间】:2015-06-15 14:42:52 【问题描述】:

如何将列表中的每个元素保存在单独的 .RData 文件中?

考虑以下示例:

# Generating a list containing 3 matrices

set.seed(1)
mylist=list(M1=matrix(LETTERS[sample(1:26,9)],3),M2=matrix(LETTERS[sample(1:26,9)],3),M3=matrix(LETTERS[sample(1:26,9)],3))
mylist[1:2]

# $M1
# [,1] [,2] [,3]
# [1,] "G"  "U"  "W" 
# [2,] "J"  "E"  "M" 
# [3,] "N"  "S"  "L" 
# 
# $M2
# [,1] [,2] [,3]
# [1,] "B"  "P"  "J" 
# [2,] "F"  "I"  "N" 
# [3,] "E"  "Q"  "R" 

# Transforming the list of matrices into a list of data frames

mylistdf=lapply(mylist,function(x)as.data.frame(x))

我的最佳尝试(不起作用)

lapply(mylistdf,function(x)save(mylistdf[x],file=paste0(getwd(),names(mylistdf)[x],'.RData')))

【问题讨论】:

试试lapply(names(mylistdf), ... lapply(names(mylistdf),function(x)save(x,file=paste0(getwd(),names(mylistdf)[x],'.RData'))) 没有给出预期的结果 akrun 的建议假设您知道如何修改其余代码以处理名称循环。但实际上,如果您想将其与lapply 压缩成一行,为什么不直接写一个for 循环呢? 我使用了lapply(names(mylistdf), function(x) x1 <- mylistdf[[x]];save(x1, file=paste0(getwd(),'/', x, '.RData')))并且能够保存它 显示的文件名是正确的,但是当在R中加载这些对象时,它们都被命名为x1,而不是M1M2M3。你知道为什么吗? lapply(list('M1.RData', 'M2.RData', 'M3.RData'), load, .GlobalEnv)# [[1]] # [1] "x1" # # [[2]] # [1] "x1" # # [[3]] # [1] "x1" 【参考方案1】:

你可以循环使用列表对象的namessave

lapply(names(mylistdf), function(x) 
       x1 <- mylistdf[[x]]
       save(x1, file=paste0(getwd(),'/', x, '.RData'))
  )

【讨论】:

【参考方案2】:
invisible(lapply(names(mylist), function(u) 
assign(u, mylist[[u]])
save(list = u, file = paste0(getwd(), "/", u, ".RData"))
))

invisible的使用来自How to create automatic text file from a list in R?,其余答案来自loop through all files in a directory, read and save them in an object R。

我已经测试了上面的代码,它可以工作。

【讨论】:

【参考方案3】:

你有没有尝试过类似的东西:

save.image(get(paste0("mylistdf$M",X)),file=paste0(getwd(),names(mylistdf)[x],'.RData'))

进入你的lapply 函数?

【讨论】:

【参考方案4】:

更有效的方法是使用purrr中的map函数

library(purrr)
map(.x = names(mylistdf), .f = function(x)
  assign(x, mylistdf[[x]])
  save(list = x, file = paste0(x, ".RData"))
  
  )

library(tidytable)
dt_map(.x = names(mylistdf), .f = function(x)
  assign(x, mylistdf[[x]])
  save(list = x, file = paste0(x, ".RData"))
  
  )

【讨论】:

以上是关于使用 R 将列表的元素保存为 data.frames的主要内容,如果未能解决你的问题,请参考以下文章

用 R 迭代地保存 .Rds data.frame 对象

R循环使用列表中的data.frame的函数

如何合并R中列表的所有元素? [复制]

使用 R 将列表的元素保存为 data.frames

R保存data.frame每次迭代

根据开始和结束索引(保存在两个向量中)并使用条件将 data.frame 拆分为较小的 data.frame