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

问题描述 投票:-2回答:3

我有一个包含30个长度为25的向量的列表:

lst <- replicate(30, 1:25, FALSE)

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

我希望它返回一个包含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

我尝试使用qazxsw poi但没有成功。

r list vector aggregate lapply
3个回答
2
投票

另一个选择是首先转置您的列表,然后使用lapply

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

1
投票

您可以将列表转换为向量然后转换为矩阵并使用#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 包计算行中位数:

matrixStats

结果是长度为25的向量:

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

1
投票

如果我理解正确,我建议转置列表,这样你就可以列出列表中的每个元素位置。

[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

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

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

希望能帮助到你

© www.soinside.com 2019 - 2024. All rights reserved.