垂直计算多个列表的中位数
Calculate median across multiple lists vertically
假设我有三个列表,每个列表都包含测试结果:
listA <- list(10, 5, 4)
listB <- list(2, 8, 3)
listC <- list(1, 5, 3)
我想按位置 垂直 找到这些列表的中位数。所以每个位置的结果将是:
- 第一名:2
- 第二名: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
带有 map
和 transpose
的选项
library(dplyr)
library(purrr)
mget(ls(pattern = ('^list[A-C]'))) %>%
transpose %>%
map_dbl(~ flatten_dbl(.x) %>% median)
#[1] 2 5 3
假设我有三个列表,每个列表都包含测试结果:
listA <- list(10, 5, 4)
listB <- list(2, 8, 3)
listC <- list(1, 5, 3)
我想按位置 垂直 找到这些列表的中位数。所以每个位置的结果将是:
- 第一名:2
- 第二名: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
带有 map
和 transpose
library(dplyr)
library(purrr)
mget(ls(pattern = ('^list[A-C]'))) %>%
transpose %>%
map_dbl(~ flatten_dbl(.x) %>% median)
#[1] 2 5 3