通过循环多个Data.frames /无法保存

Posted

技术标签:

【中文标题】通过循环多个Data.frames /无法保存【英文标题】:through loop multiple Data.frames / can't save 【发布时间】:2016-06-07 12:16:08 【问题描述】:

我通过一个循环制作了 8 个 data.frame,但是当我尝试保存它时,只保存了一个 data.frame。

`for(i in 1:8)id<-c(1,2,3,4,5,6,7,8)
i1<- c(rbinom(8,1,.5))
i2<-c(rbinom(8,1,.5))
rt1<-c(rnorm(8))
rt2<-c(rnorm(8))
df <- data.frame(id,i1,i2,rt1,rt2);print(df)->X

我需要将所有 8 个 data.frames 保存在单独的 txt.files 中,但如果我不能将所有 8 个 data.frames 保存在一个变量中,我不能使用 write.table 来实现。

【问题讨论】:

将您的 data.frames 保存到列表中:for( i in ...) ... myList[[i]] &lt;- df ...。然后,您可以以myList[[i]] 访问每个data.frame。请参阅this post 了解更多信息。 【参考方案1】:

我们可以在list 中创建它

lst <-  replicate(8, id<-c(1,2,3,4,5,6,7,8)
             i1<- rbinom(8,1,.5)
             i2<- rbinom(8,1,.5)
             rt1<-rnorm(8)
             rt2<- rnorm(8)
             df <- data.frame(id,i1,i2,rt1,rt2),
                                    simplify = FALSE)

然后使用[[访问每个data.frame

lst[[1]]
lst[[2]]

如果我们需要在全局环境中创建8个data.frame对象,使用list2env(虽然不推荐)

list2env(setNames(lst, paste0("df", seq_along(lst))), envir =.GlobalEnv)
df1
#  id i1 i2         rt1        rt2
#1  1  0  0 -0.10005874 -0.7554699
#2  2  0  1  0.73783083  0.9486937
#3  3  0  0  0.60071808 -0.6073825
#4  4  0  0  1.34181501 -0.7873832
#5  5  1  1  0.74039777 -0.4152928
#6  6  0  0  0.70413214  0.3182971
#7  7  0  1 -1.34215328  0.6912802
#8  8  1  1  0.08427694  0.6138306

df2
#  id i1 i2        rt1        rt2
#1  1  0  0 -0.5756818 -1.8153806
#2  2  0  1  0.6438000  0.4386427
#3  3  1  0  0.1849091  0.2079155
#4  4  1  1  1.0915329  0.9173109
#5  5  1  0 -0.6868610  0.2586526
#6  6  0  0  0.6588452  0.8982610
#7  7  1  1  0.7612920 -0.5889034
#8  8  1  1  0.7771745  0.4025183

如果我们需要 for 循环,请创建一个长度为 N(这里为 8)的空 list,并将每次迭代的输出分配给它。

lst1 <- vector("list", 8)
for(i in 1:8)
      id<-c(1,2,3,4,5,6,7,8)
      i1<-  rbinom(8,1,.5)
      i2<-  rbinom(8,1,.5)
      rt1<- rnorm(8)
      rt2<- rnorm(8)
      lst1[[i]] <- data.frame(id,i1,i2,rt1,rt2)
   

或者取而代之的是,我们可以assign 在每次迭代中使用一个新的对象名称,这样全局环境中就会有 8 个 data.frame 对象

  for(i in 1:8)
      id<-c(1,2,3,4,5,6,7,8)
      i1<-  rbinom(8,1,.5)
      i2<-  rbinom(8,1,.5)
      rt1<- rnorm(8)
      rt2<- rnorm(8)
      assign(paste0("newdf", i), value= data.frame(id,i1,i2,rt1,rt2))
   



newdf1
#  id i1 i2         rt1        rt2
#1  1  1  0  0.18472864  0.5929184
#2  2  1  1  0.72289366  0.9227808
#3  3  0  0  1.67604392  1.1759845
#4  4  0  0 -1.37200571 -1.4740593
#5  5  1  0 -1.60339952  0.7562232
#6  6  1  1 -2.33245352  0.9699605
#7  7  0  0  0.05202936  0.9604707
#8  8  0  0 -0.99444913  0.5079725

【讨论】:

是的,谢谢你的帮助,这几乎是我想要的,但我需要用循环命令创建这个数据框 是的,关于 R 编程 感谢这是一个很大的帮助!我有一个小问题,尽管我如何使用 write.table 将这 8 个数据帧保存在 8 个不同的文本文件中?我只有在尝试时才会出错 @J.Goodcat 在这种情况下,您不需要全局环境中的单独对象。使用list。即lst2 &lt;- setNames(lst1, paste0("newdf", seq_along(lst1))); lapply(names(lst2), function(x) write.csv(lst1[[x]], paste0(x, ".csv"), row.names=FALSE, quote=FALSE) 如果我写这个命令 R 说缺少一些东西。我只需要将这 8 个数据帧保存在带有写入数据的单独 txt 文件中,然后将这 8 个数据帧与第二个循环命令组合到一个数据-帧

以上是关于通过循环多个Data.frames /无法保存的主要内容,如果未能解决你的问题,请参考以下文章

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

保存和加载data.frames [重复]

保存和加载data.frames

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

如何在 R 中 dplyr::inner_join 多个 tbls 或 data.frames

在过滤R data.frames时更新因子水平[重复]