垂直计算多个列表的中位数

Calculate median across multiple lists vertically

假设我有三个列表,每个列表都包含测试结果:

listA <- list(10, 5, 4)
listB <- list(2, 8, 3)
listC <- list(1, 5, 3)

我想按位置 垂直 找到这些列表的中位数。所以每个位置的结果将是:

我如何在 R 中实现这一点?提前致谢。

使用 mget 将所有单独的列表放在一个列表中,将它们组合成一个矩阵并取 row-wise 中位数。

matrixStats::rowMedians(sapply(mget(ls(pattern = 'list')), unlist))
#[1] 2 5 3

或者将其保留在基数 R 中:

mat <- sapply(mget(ls(pattern = 'list')), unlist)
apply(mat, 1, median)

您可以使用Map()垂直组合三个列表,然后通过lapply()计算每个中位数。

sapply(Map(c, listA, listB, listC), median)

# [1] 2 5 3

您还可以使用 purrr 中的 transpose()

library(purrr)

map_dbl(transpose(mget(ls(pattern = 'list'))), ~ median(flatten_dbl(.x)))

# [1] 2 5 3

或使用pmap():

pmap_dbl(mget(ls(pattern = 'list')), ~ median(c(...)))

# [1] 2 5 3

我必须稍微更改数据类型才能使其正常工作,可能会先查看其他答案,但这是我为满足您的要求所做的。我将值放在向量中,然后放在数据框中而不是列表中,然后在您想要的可敬列上调用 median() 函数。

listA <- c(10, 5, 4)
listB <- c(2, 8, 3)
listC <- c(1, 5, 3)

test <- as.data.frame(rbind(listA, listB, listC))

median(test[,1])
[1] 2
median(test[,2])
[1] 5
median(test[,3])
[1] 3

带有 maptranspose

的选项
library(dplyr)
library(purrr)
mget(ls(pattern = ('^list[A-C]'))) %>% 
   transpose %>%
   map_dbl(~ flatten_dbl(.x) %>% median)
#[1] 2 5 3