如何在列表中保存数据框

时间:2015-04-08 13:09:02

标签: r list dataframe

我有一些数据框出现在代码的不同迭代中。让它成为100次迭代。每次我将数据帧写入df,我用它来存储即将到来的帧。

数据框

第一次迭代

       V1          V2           V3          V4  
      5.1         3.5          1.4         0.2  
      4.9         3.0          1.4         0.2  
      4.7         3.2          1.3         0.2  
      4.6         3.1          1.5         0.2  
      5.0         3.6          1.4         0.2  

第二次迭代

          V1          V2           V3          V4  
          5.1         3.5          1.4         0.2  
          4.9         3.0          1.4         0.2  
          4.7         3.2          1.3         0.2  
          4.6         3.1          1.5         0.2  
          5.0         3.6          1.4         0.2 

第三次迭代

  V1          V2           V3          V4  
  5.1         3.5          1.4         0.2  
  4.9         3.0          1.4         0.2  
  4.7         3.2          1.3         0.2  
  4.6         3.1          1.5         0.2  
  5.0         3.6          1.4         0.2  

等等

现在最后我想在列表中包含所有数据框,以便我可以处理列表以进行其他操作。我该怎么做?

以下是示例代码

data = list.files(pattern=".csv")
data1 = lapply(data, function(x) read.csv(x, header = TRUE))
files = length(data1)
for(i in 1:length(files))
{
  ......
  code
  ......
}
 df   ## say some df is generated each time 

1 个答案:

答案 0 :(得分:1)

从评论中,我了解到您正在尝试通过某些算法的连续迭代生成data.frame对象列表 - 每个算法都生成一个新的data.frame。

假设我们有一些函数f()从一些源生成一个新的data.frame,并且可能在返回之前上传data.frame。

f <- function() {
    # read a file, do some work, produce a dataframe, etc
    df # return the new data.frame()
}

使用append或类似的东西将新的data.frame添加到列表中的问题是,它习惯于“展开”框架并合并它。

相反,您的代码需要这样的结构:

output_list <- list() # A list to hold the generated frames

while (more_work_to_do) {
    df <- f() #One iteration
    output_list[[length(output_list)+1]] <- df
}

# At this point, output_list is a list of the generated data frames
# with all their internal structure preserved.

对插入使用[[]]运算符非常重要,以避免“要替换的项目数不是替换长度的倍数”错误。 length(output_list)+1构造只是意味着“一个超过数组的当前末尾”,实际上是为你追加而不需要维护一个单独的计数器。

这是一个例子

> f<-function() { data.frame(x=rnorm(5), y=rnorm(5)) }
> output_list <- list()
> for (i in 1:5) output_list[[length(output_list)+1]] <- f()
> length(output_list)
[1] 5
> str(output_list)
List of 5
 $ :'data.frame':   5 obs. of  2 variables:
  ..$ x: num [1:5] -0.347 0.194 -0.406 -0.384 2.24
  ..$ y: num [1:5] -0.756 0.3417 -0.7542 0.1612 -0.0494
 $ :'data.frame':   5 obs. of  2 variables:
  ..$ x: num [1:5] 0.667 -0.186 0.602 -0.239 1.516
  ..$ y: num [1:5] 0.263 -1.322 0.604 -0.135 -0.339
 $ :'data.frame':   5 obs. of  2 variables:
  ..$ x: num [1:5] 1.064 -0.365 -1.584 0.163 0.142
  ..$ y: num [1:5] -0.0782 1.3314 0.0797 -0.4096 0.4819
 $ :'data.frame':   5 obs. of  2 variables:
  ..$ x: num [1:5] -2.0448 -0.4228 -0.5305 -0.0611 0.4114
  ..$ y: num [1:5] -0.608 -0.74 -0.196 -0.957 0.653
 $ :'data.frame':   5 obs. of  2 variables:
  ..$ x: num [1:5] 0.582 -1.029 -1.222 1.755 0.259
  ..$ y: num [1:5] 1.733 0.319 -0.597 -1.814 0.446
> output_list
[[1]]
           x           y
1 -0.3474823 -0.75595301
2  0.1941049  0.34170577
3 -0.4055180 -0.75424689
4 -0.3838479  0.16122522
5  2.2397387 -0.04936943

[[2]]
           x          y
1  0.6674517  0.2625242
2 -0.1859460 -1.3219586
3  0.6020241  0.6042548
4 -0.2387514 -0.1345904
5  1.5158875 -0.3392787

[[3]]
           x           y
1  1.0639814 -0.07823834
2 -0.3645768  1.33144410
3 -1.5839606  0.07973743
4  0.1630311 -0.40957609
5  0.1420562  0.48187377

[[4]]
            x          y
1 -2.04475082 -0.6083283
2 -0.42280601 -0.7396052
3 -0.53048188 -0.1961052
4 -0.06107144 -0.9571272
5  0.41136718  0.6526753

[[5]]
           x          y
1  0.5821866  1.7325293
2 -1.0289847  0.3186825
3 -1.2218606 -0.5971967
4  1.7548963 -1.8136810
5  0.2592219  0.4463977

>