【问题标题】:How to save data frames in a list如何将数据框保存在列表中
【发布时间】:2015-04-08 13:09:02
【问题描述】:

我有一些数据帧来自我的代码的不同迭代。让它大约有 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 

【问题讨论】:

  • 请包含您用于生成这些数据帧的代码。
  • 类似:lapply(1:100, function(u) {#do something returning a dataframe})
  • 执行示例代码的前两行后,您会得到什么?
  • @ColonelBeauvel .. 你的意思是像data <- lapply(1:length(files), function(u) {df})
  • 是的,这里有相同数据的列表。框架是 df 在某处定义。

标签: r list dataframe


【解决方案1】:

从 cmets 了解到,您正在尝试通过某些算法的顺序迭代生成一个 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

> 

【讨论】:

    猜你喜欢
    • 2016-08-20
    • 2011-12-25
    • 1970-01-01
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    • 2021-09-17
    • 2015-06-19
    • 1970-01-01
    相关资源
    最近更新 更多