我有几个命名的号码列表,其输出如下:
list1
A B C
5.0 1.29 3.54
list2
A B C
6.0 2.29 4.54
我想计算与相同名称对应的所有值的中位数。例如,对应于“ A”的所有值的中值。 我的想法是从每个列表中提取对应于“ A”的值并创建一个数据框。我该怎么做呢?
否则,有没有更好的方法来计算中位数?
谢谢
答案 0 :(得分:0)
我的解决方案创建一个列表列表,然后使用sapply将“ A”元素检索到向量中,然后取中位数。
list1 <- list(5,1.29,3.54)
list2 <- list(6,2.29,4.54)
list3 <- list(7,3.29,4.54)
names(list1) <- c("A","B","C")
names(list2) <- c("A","B","C")
names(list3) <- c("A","B","C")
##
median_a <- median(sapply(list(list1, list2, list3), function(i)i[["A"]]))
median_b <- median(sapply(list(list1, list2, list3), function(i)i[["b"]]))
##Alternatively you can put everything in a dataframe, and then take the median using apply
df <- data_frame_of_values <- data.frame(
a = sapply(list(list1, list2, list3), function(i)i[["A"]]),
b = sapply(list(list1, list2, list3), function(i)i[["B"]]),
c = sapply(list(list1, list2, list3), function(i)i[["C"]])
)
apply(df, MARGIN = 2,median) ##This retrieves the medians
答案 1 :(得分:0)
这不是很漂亮,但是可以。利用了tidyverse中的as.data.frame()
,t()
和summarize_all()
。
library(tidyverse)
lst <- list(c(A = 5.0, B = 1.29, C = 3.54), c(A = 6.0, B = 2.29, C = 4.54))
lst %>%
as.data.frame(col.names = 1:length(lst)) %>%
t() %>%
data.frame() %>%
summarize_all(median)