我有30个lentgh 25向量的列表:
angular.json
我想找到30个向量中第一个元素的中值,然后是第二个元素的中值...依此类推,直到第25个元素。
我希望它返回具有25个值的向量
上面简单示例的结果将显示为
ngAfterViewInit
我尝试过lst <- replicate(30, 1:25, FALSE)
,但没有成功。
答案 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)
#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))
希望有帮助