有没有办法将更大列表中的数据框列表加在一起?
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
功能,但无济于事
在此先感谢您的帮助!
我们可以用Reduce
对list
中对应的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]])])))
如果我们想使用sum
,list
中的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]]
我有一个大列表 (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
功能,但无济于事
在此先感谢您的帮助!
我们可以用Reduce
对list
中对应的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]])])))
如果我们想使用sum
,list
中的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]]