Применение функции через вложенный список - PullRequest
1 голос
/ 18 октября 2019

Скажем, у меня есть следующий список

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)), но, очевидно, он не возвращает желаемый результат.

Ответы [ 3 ]

2 голосов
/ 18 октября 2019

Это довольно уродливо, но мы можем использовать mapply для перебора списков, но нам нужно расширить список до параметров с помощью do.call

do.call("mapply", c(function(...) rowMeans(data.frame(...)), raw, SIMPLIFY=FALSE))

Вы можете сделать это красивее, используя purrrпакет

purrr::pmap(raw, ~rowMeans(data.frame(...)))
2 голосов
/ 18 октября 2019

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 голос
/ 18 октября 2019

Вы можете поместить вещь в массив и взять ячейку 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, ])
...