【问题标题】:Use loop to split a list into multiple dataframes使用循环将列表拆分为多个数据帧
【发布时间】:2012-08-31 12:05:46
【问题描述】:

我是 R 的初学者,我无法在网上任何地方找到解决方案。

我有一个由 50 个数据框组成的列表对象。我想将此列表拆分为单独的 data.frame 对象,但在执行此操作时遇到了问题。

手动操作很简单:

a<-list[[1]]

但我想循环它,这样我就不必手动输入所有 50 个组件。这不起作用:

for(i in 1:n.imp)
    a.i<-comb.txt1[[i]]

因为它只生成一个(最后一个)数据帧。

有什么想法吗?

这里有一些额外的上下文:这个列表是多重插补过程的产物——mi()。我想将一个新变量合并到每个估算数据集中,但似乎无法弄清楚如何做到这一点,因为对象是一个列表。

【问题讨论】:

  • 为什么不使用lapply进行合并。举例说明您想要做什么(例如 dput(head(comb.txt, n=2)) 以及您想要合并的内容

标签: r list


【解决方案1】:

我想这就是你所追求的:

for(i in 1:length(comb.txt1)) {
    assign(paste0("a.", i), comb.txt1[[i]])
}

【讨论】:

  • 但在考虑这种方法之前,请参阅fortune(236)。从长远来看,直接使用列表会简单得多。
  • 你想要的是lapply(comb.txt1,function(a){ a$newvar &lt;-newvar;a }) 如果你的新变量对于列表中的每个元素都不同,我可以告诉你如果你愿意怎么做(它涉及mapply)。如果你的 newvar 不是它应该的顺序,或者你的 data.frames 不是都在相同的顺序,你会使用lapply(comb.txt1,function(a){ merge(a,newdataset,by="idvar") })
  • 有了一个共同的 id,我同意合并是有意义的。如果数据框完全不相关,我倾向于将它们留在列表中,而不是创建新变量。
【解决方案2】:

你可以使用attach(comb.txt1),如果你的列表有名字,或者你给它命名为names(comb.txt1) &lt;- paste('a', seq_along(comb.txt1), sep='.')

不过,可能没有必要用 50 个data.frames 弄乱您的工作区。假设您要添加到每个data.frame 的新变量是某个原子向量var(即,像c(1,2,3) 这样的向量)。您可以使用lapply(comb.txt1, function(comb.txt1.DF) within(comb.txt1.DF, new.var &lt;- var)) 将其添加到list 中的每个data.frame

【讨论】:

    【解决方案3】:

    我不确定这是您要找的东西,但是...

    生成数据框列表:

    > set.seed(1)
    > df1 <- data.frame(a=rnorm(10), b=rnorm(10))
    > df2 <- data.frame(a=rnorm(10), b=rnorm(10))
    > df3 <- data.frame(a=rnorm(10), b=rnorm(10))
    
    > my.list <- list(df1, df2, df3)
    

    然后,将 assign() 与 lapply() 一起使用:

    > lapply(seq_along(my.list), 
             function(i,x) {assign(paste0("a",i),x[[i]], envir=.GlobalEnv)},
             x=my.list)
    
    > a1
                a           b
    1  -0.6264538  1.51178117
    2   0.1836433  0.38984324
    3  -0.8356286 -0.62124058
    4   1.5952808 -2.21469989
    5   0.3295078  1.12493092
    6  -0.8204684 -0.04493361
    7   0.4874291 -0.01619026
    8   0.7383247  0.94383621
    9   0.5757814  0.82122120
    10 -0.3053884  0.59390132
    

    【讨论】:

      猜你喜欢
      • 2023-01-19
      • 2022-01-07
      • 2019-07-29
      • 1970-01-01
      • 1970-01-01
      • 2013-11-16
      相关资源
      最近更新 更多