从多个列表中提取值

时间:2019-01-27 22:52:35

标签: r

我有几个命名的号码列表,其输出如下:

list1

A         B       C      
5.0      1.29    3.54

list2

A         B       C      
6.0     2.29    4.54

我想计算与相同名称对应的所有值的中位数。例如,对应于“ A”的所有值的中值。 我的想法是从每个列表中提取对应于“ A”的值并创建一个数据框。我该怎么做呢?

否则,有没有更好的方法来计算中位数?

谢谢

2 个答案:

答案 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)