有没有办法将更大列表中的数据框列表加在一起?

Is there a way to sum together lists of data frames within a larger list?

我有一个大列表 (z),其中包含 3 个列表,每组 10 个数据框。我想将这个对象折叠成 3 个数据帧的列表,其中每个数据帧是 10 个先前数据帧的总和(想想矩阵加法)。这是我正在使用的,请记住这些是假数字,因为真实数据是从数百个 *.csv 文件中读取的

x = rep(1,100)
x = matrix(x,10,10)
x = as.data.frame(x)
y = list(x,x,x,x,x,x,x,x,x,x)
z = list(y,y,y)  

所需的最终产品如下所示:

x1 = rep(10,100)
x1 = matrix(x,10,10)
y1 = list(x1,x1,x1)

我一直在尝试以下方法:

z1 = c()
for (i in 1:3){
  for (j in 1:10){
    z1[[i]] = sum(z[[i]][[j]])
  }
  }

但是,这不会产生所需的输出。我也弄乱了一些 apply 功能,但无济于事

在此先感谢您的帮助!

我们可以用Reducelist中对应的i,j元素求和,合并成一个数据集

lapply(z, function(x) Reduce(`+`, x))

如果我们要删除非数字的最后一列

lapply(z, function(x) Reduce(`+`, lapply(x, function(y) y[-ncol(y)])))

或者可以遍历list

的序列
lapply(seq_along(z), function(i) Reduce(`+`, lapply(seq_along(z[[i]]), 
          function(j) z[[i]][[j]][-ncol(z[[i]][[j]])])))

如果我们想使用sumlist中的data.frame可以转换为array,循环array apply,指定 MARGIN 并执行 sum。在此选项中,还可以在 sum

中使用 na.rm = TRUE 处理 NA 元素
lapply(z, function(x) apply(array(unlist(x), c(10, 10, 10)),
        1:2, sum, na.rm = TRUE))

或者通过仅在一维上循环并使用 colSums

来提高效率
lapply(z, function(x) apply(array(unlist(x), c(10, 10, 10)), 1, colSums, na.rm = TRUE))

或使用 for 循环

z1 <- replicate(length(z), matrix(0, 10, 10), simplify = FALSE)
for(i in seq_along(z)) for(j in seq_along(z[[1]])) z1[[i]] <- z1[[i]] + z[[i]][[j]]