【问题标题】:Adding data frames as list elements (using for loop)将数据框添加为列表元素(使用 for 循环)
【发布时间】:2013-11-16 11:46:24
【问题描述】:

我的环境中有一系列称为 EOG 的数据框。从 2006 年到 2012 年,每年都有一个。例如,EOG2006、EOG2007...EOG2012。我想将它们添加为列表的元素。

首先,我想知道这是否可能。我阅读了官方的 R 指南和一些 R 编程手册,但没有找到明确的示例。

其次,我想使用 for 循环来做到这一点。不幸的是,我用来完成这项工作的代码是错误的,我要疯了。

for (j in 2006:2012){
z<-j
sEOG<-paste("EOG", z, sep="")
dEOG<-get(paste("EOG", z, sep=""))
lsEOG<-list()
lsEOG[[sEOG]]<-dEOG
}

这将返回一个包含一个元素的列表。哪里错了?

【问题讨论】:

标签: r list for-loop dataframe


【解决方案1】:

您不断在循环内重新初始化列表。您需要将lsEOG&lt;-list() 移到for 循环之外。

lsEOG<-list()

for (j in 2006:2012){
  z <- j
  sEOG <- paste("EOG", z, sep="")
  dEOG <- get(paste("EOG", z, sep=""))
  lsEOG[[sEOG]] <-dEOG
}

另外,您可以直接在paste 函数中使用j

sEOG <- paste("EOG", j, sep="")

【讨论】:

    【解决方案2】:

    我有同样的问题,但觉得 OP 的初始代码对于 R 初学者来说有点不透明。因此,这里可能是一个更清晰的示例,说明如何在循环中创建数据帧并将它们添加到我刚刚通过在 R shell 中玩弄的列表中:

     > dfList <- list()  ## create empty list
     >
     > for ( i in 1:5 ) {
     +     x <- rnorm( 4 )
     +     y <- sin( x )
     +     dfList[[i]] <- data.frame( x, y )  ## create and add new data frame
     + }
     >
     > length( dfList )  ## 5 data frames in list
     [1] 5
     >
     > dfList[[1]]    ## print 1st data frame
                x          y
     1 -0.3782376 -0.3692832
     2 -1.3581489 -0.9774756
     3  1.2175467  0.9382535
     4 -0.7544750 -0.6849062
     >
     > dfList[[2]]    ## print 2nd data frame
                x          y
     1 -0.1211670 -0.1208707
     2 -1.5318212 -0.9992406
     3  0.8790863  0.7701564
     4  1.4014124  0.9856888
     >
     > dfList[[2]][4,2]   ## in 2nd data frame, print element in row 4 column 2
     [1] 0.9856888
     >
    

    对于像我这样的 R 初学者,请注意,访问第 i 个数据框需要双括号。基本上,双括号用于列表,而单括号用于向量。

    【讨论】:

      【解决方案3】:

      如果数据框保存为对象,您可以通过apropos("EOG", ignore.case=FALSE) 找到它们,并通过循环将它们存储在列表中:

      list.EOG<- apropos("EOG", ignore.case=FALSE) #Find the objects with case sensitive 
      lsEOG<-NULL #Creates the object to full fill in the list
      for (j in 1:length(list.EOG)){
      lsEOG[i]<-get(list.EOG[i]) #Add the data.frame to each element of the list
      }
      

      将每个人的名称添加到您可以使用的列表中:

      names(lsEOG, "names")<-list.EOG
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-12
        • 2022-07-19
        • 2019-11-05
        • 1970-01-01
        • 2018-01-27
        • 1970-01-01
        相关资源
        最近更新 更多