说,我有以下列表
raw <- list(list(1:2, 2:3, 3:4), list(4:5, 5:6, 6:7), list(7:8, 8:9, 9:10))
我想找到最外层列表中相应条目的均值。预期的输出将类似于
[[1]]
[1] 4 5
[[2]]
[1] 5 6
[[3]]
[1] 6 7
这是因为1:2
,4:5
和7:8
的均值为4:5
。
我一直在尝试诸如lapply(raw, function(x) lapply(x, mean))
之类的东西,但是显然它没有返回期望的输出。
答案 0 :(得分:2)
1
n = length(raw[[1]])
lapply(1:n, function(i){
d = do.call(rbind, lapply(seq_along(raw), function(j){
raw[[j]][[i]]
}))
apply(d, 2, mean)
})
#[[1]]
#[1] 4 5
#[[2]]
#[1] 5 6
#[[3]]
#[1] 6 7
2
aggregate(. ~ ind, do.call(rbind, lapply(raw, function(x)
data.frame(cbind(do.call(rbind, x), ind = seq_along(x))))), mean)
# ind V1 V2
#1 1 4 5
#2 2 5 6
#3 3 6 7
答案 1 :(得分:2)
这很丑陋,但是我们可以使用mapply遍历列表,但是我们需要通过do.call
将列表扩展为参数
do.call("mapply", c(function(...) rowMeans(data.frame(...)), raw, SIMPLIFY=FALSE))
您可以使用purrr
软件包使它更漂亮
purrr::pmap(raw, ~rowMeans(data.frame(...)))
答案 2 :(得分:1)
您可以将东西放入数组中并放入median
s个单元格(我想您要使用这些元素而不是mean
s)。
A <- array(matrix(unlist(raw), 2, byrow=FALSE), dim=c(2, 3, 3))
v.mds <- t(apply(A, 1:2, median))
lapply(1:3, function(x) v.mds[x, ])
# [[1]]
# [1] 4 5
#
# [[2]]
# [1] 5 6
#
# [[3]]
# [1] 6 7
概括如下:
A <- array(matrix(unlist(raw), length(el(el(raw))), byrow=0),
dim=c(length(el(el(raw))), el(lengths(raw)), length(raw)))
v.mds <- t(apply(A, 1:2, median))
lapply(1:nrow(v.mds), function(x) v.means[x, ])