1

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

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

手动操作很简单:

a<-list[[1]]

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

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

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

有什么想法吗?

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

4

3 回答 3

4

我认为这就是你所追求的:

for(i in 1:length(comb.txt1)) {
    assign(paste0("a.", i), comb.txt1[[i]])
}
于 2012-08-31T12:17:15.620 回答
2

你可以使用attach(comb.txt1), 如果你的列表有名字,或者你给它起类似的名字names(comb.txt1) <- paste('a', seq_along(comb.txt1), sep='.')

data.frames不过,可能没有必要用 50 个来弄乱您的工作空间。假设您要添加到每个的新变量data.frame是一些原子向量var(即,像 的向量c(1,2,3))。您可以将其添加到data.frame您的listwith中的每个中lapply(comb.txt1, function(comb.txt1.DF) within(comb.txt1.DF, new.var <- var))

于 2012-08-31T14:12:38.853 回答
1

我不确定那是您正在寻找的东西,但是...

生成数据框列表:

> 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
于 2012-08-31T14:03:26.963 回答