元素存储在列表中的许多向量

时间:2018-09-10 08:08:46

标签: r list vector aggregate lapply

我有30个lentgh 25向量的列表:

angular.json

我想找到30个向量中第一个元素的中值,然后是第二个元素的中值...依此类推,直到第25个元素。

我希望它返回具有25个值的向量

上面简单示例的结果将显示为

ngAfterViewInit

我尝试过lst <- replicate(30, 1:25, FALSE) ,但没有成功。

3 个答案:

答案 0 :(得分:2)

另一种选择是先转置列表,然后使用sapply

lst <- list(a = 1:3,
            b = 1:3,
            c = 1:3,
            d = 1:3)

sapply(data.table::transpose(lst), median)
#[1] 1 2 3

结果与

apply(do.call(rbind, lst), 2, median)

基准

set.seed(1)
n <- 1e5
lst <- replicate(n = n, expr = sample(100), simplify = FALSE)

library(microbenchmark)

markus1 <- function(x) sapply(data.table::transpose(x), median)
markus2 <- function(x) apply(do.call(rbind, x), 2, median)
Onyambu <- function(x) apply(t(data.frame(x)), 2, median)
PoGibas <- function(x) matrixStats::rowMedians(matrix(unlist(x), ncol = length(x)))
PoGibas2 <- function(x) matrixStats::rowMedians(unlist(x), ncol = length(x), dim. = c(length(x[[1]]), length(x)))
Maik <- function(x) sapply(lapply(1:length(x[[1]]), function(j) sapply(x, "[[", j)), median)

benchmark <- microbenchmark(
  markus1(lst),
  markus2(lst),
  Onyambu(lst), 
  PoGibas(lst),
  PoGibas2(lst),
  Maik(lst),
  times = 100
)

autoplot.microbenchmark(benchmark)

enter image description here

#Unit: milliseconds
#          expr        min         lq       mean     median         uq        max neval
#  markus1(lst)   218.6485   263.9614   303.5073   302.1517   329.9800   552.4448   100
#  markus2(lst)   417.4680   509.9305   552.8606   541.3165   571.3282   823.5757   100
#  Onyambu(lst) 11038.8465 11492.1539 11972.0715 11718.6827 12193.1600 15751.3892   100
#  PoGibas(lst)   257.9104   276.8268   336.9063   344.8842   379.1340   513.6330   100
# PoGibas2(lst)   238.3503   251.9929   274.8687   257.5234   276.5978   486.7224   100
#     Maik(lst)  6423.6823  6728.7237  7044.0386  6863.9510  7222.4687  9070.8505   100

答案 1 :(得分:1)

您可以将列表转换为向量,然后使用matrixStats包对矩阵进行矩阵计算并计算行中位数:

foo <- list(1:25, 1:25, 1:25)
matrixStats::rowMedians(matrix(unlist(foo), ncol = length(foo)))

结果是长度为25的向量:

[1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

答案 2 :(得分:1)

如果我理解正确,我建议对列表进行转置,因此您为列表中的每个元素位置都有一个列表。

transpose = lapply(1:length(your_list[[1]]), function(j) sapply(your_list, "[[", j))

格式化后,只需调用一个sapply函数即可获取原始列表中每个位置的中值向量:

result = sapply(transpose, function(x) median(x))

希望有帮助