在嵌套列表中应用函数

时间:2019-10-18 15:07:10

标签: r list nested apply lapply

说,我有以下列表

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:24:57:8的均值为4:5

我一直在尝试诸如lapply(raw, function(x) lapply(x, mean))之类的东西,但是显然它没有返回期望的输出。

3 个答案:

答案 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, ])