我有一个包含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但没有成功。
另一个选择是首先转置您的列表,然后使用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)
您可以将列表转换为向量然后转换为矩阵并使用#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 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))
希望能帮助到你