【问题标题】:extract values from multiple lists从多个列表中提取值
【发布时间】:2019-01-27 22:52:34
【问题描述】:

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

列表1

A         B       C      
5.0      1.29    3.54

列表2

A         B       C      
6.0     2.29    4.54

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

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

谢谢

【问题讨论】:

  • 你有列表还是向量?你能粘贴dput(list1)吗?
  • dput(list1) 给出输出:c(A =5, B = 1.29, C = 3.45)

标签: r


【解决方案1】:

我的解决方案创建一个列表列表,然后使用 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

【讨论】:

  • 为什么你不能只做c(by(b&lt;-unlist(c(list1,list2,list3)),names(b),median)) 或者更确切地说:a&lt;-unlist(c(list1,list2,list3)); tapply(a,names(a),median)???
【解决方案2】:

这并不漂亮,但它确实有效。使用 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)

【讨论】:

    猜你喜欢
    • 2021-09-17
    • 2020-08-10
    • 1970-01-01
    • 2018-10-03
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    • 2010-09-17
    • 1970-01-01
    相关资源
    最近更新 更多