【问题标题】:Applying functions over a list of data frames to get summary values在数据框列表上应用函数以获取汇总值
【发布时间】:2017-06-20 09:52:27
【问题描述】:

我有两个数据框 df1 和 df2 的列表(请参阅下面的数据)。对于每个数据框,我试图获得两个汇总数字 1)Pat 和 Ben 的计数和 2)Pat 和 Ben 的 a 和 b 列(0/0 或 1/1)之间的一致性出现次数。使用 dplyr,我可以像这样从数据帧中单独获取这些数字(例如,dput(my_list) 中下面列表中的 df1:

   final_table<-mutate(df1,dam=apply(df1[,c(1:2)],1,function(x)length(grep("1",as.factor(x)))))%>%mutate(tol=apply(df1[,c(1:2)],1,function(x)length(grep("0",as.factor(x)))))%>% mutate(prop.concordant=ifelse(dam==0,1,dam/(dam+tol)))%>%group_by(c)%>%summarise(count=n(),complete_concordance_num=length(which(prop.concordant==1)))

看起来像这样:

> final_table
# A tibble: 2 x 3
      c count complete_concordance_num
  <chr> <int>                    <int>
1   Ben    43                       37
2   Pat    57                       55

但是,我在通过数据框列表(即列表中的 df1 和 df2)实现此功能时遇到问题。 lapplypurrr::map 似乎都不起作用。每个数据帧的障碍似乎是不同的列名(第 1 列和第 2 列)。真的很感激任何线索!

这是一个测试列表(实际列表包含 500 个数据框,每个数据框的第 1 列和第 2 列名称不同):

dput(my_list)     
list(structure(list(a = c("0", "0", "1", "1", "1", "1", "1", 
"0", "0", "0", "1", "1", "1", "1", NA, "1", "0", "0", "1", "1", 
"1", NA, "1", "1", "1", "0", "0", "1", "1", "0", "1", "1", "0", 
"1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "0", "1", "0", 
"1", "1", "1", NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
"0", "1", "1", "1", "1", "1", "1", "0", "1", "0", "1", "0", "1", 
"1", "0", NA, NA, "0", NA, "1", "0", "1", "1", "1", "1", "1", 
"1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1"
), b = c("1", "0", "1", "1", "1", "1", "1", "0", "0", "0", "1", 
"1", "1", "1", "1", "1", "1", "0", "1", "1", "1", "1", "1", "0", 
"1", "0", "1", "1", "1", "1", "1", "1", "0", "1", "1", "1", "1", 
"1", "1", "1", "1", "1", "1", "0", "0", "1", "1", "1", "1", "1", 
"0", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "0", "1", 
"1", "1", "1", "1", "1", "0", "1", "0", "1", "0", "1", "1", "0", 
"1", "1", "0", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", 
"1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1"), c = c("Pat", 
"Ben", "Pat", "Pat", "Pat", "Pat", "Pat", "Ben", "Ben", "Ben", 
"Ben", "Ben", "Ben", "Ben", "Ben", "Ben", "Ben", "Ben", "Ben", 
"Ben", "Ben", "Ben", "Ben", "Ben", "Ben", "Ben", "Ben", "Ben", 
"Pat", "Ben", "Pat", "Pat", "Ben", "Pat", "Pat", "Pat", "Pat", 
"Pat", "Pat", "Pat", "Pat", "Ben", "Ben", "Ben", "Ben", "Ben", 
"Pat", "Pat", "Pat", "Ben", "Ben", "Pat", "Pat", "Pat", "Pat", 
"Pat", "Pat", "Pat", "Pat", "Pat", "Pat", "Ben", "Pat", "Pat", 
"Pat", "Ben", "Pat", "Ben", "Ben", "Pat", "Ben", "Pat", "Ben", 
"Pat", "Pat", "Ben", "Ben", "Ben", "Ben", "Ben", "Ben", "Pat", 
"Pat", "Pat", "Pat", "Pat", "Pat", "Pat", "Pat", "Pat", "Pat", 
"Pat", "Pat", "Pat", "Pat", "Pat", "Pat", "Pat", "Pat", "Pat"
)), .Names = c("a", "b", "c"), row.names = c(NA, 100L), class = "data.frame"), 
    structure(list(x = c("0", "0", "1", "1", "1", "1", "1", "0", 
    "0", "0", "1", "1", "1", "1", NA, "1", "0", "0", "1", "1", 
    "1", NA, "1", "1", "1", "0", "0", "1", "1", "0", "1", "1", 
    "0", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "0", 
    "1", "0", "1", "1", "1", NA, NA, NA, NA, NA, NA, NA, NA, 
    NA, NA, NA, NA, "0", "1", "1", "1", "1", "1", "1", "0", "1", 
    "0", "1", "0", "1", "1", "0", NA, NA, "0", NA, "1", "0", 
    "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", 
    "1", "1", "1", "1", "1", "1"), y = c("1", "0", "1", "1", 
    "1", "1", "1", "0", "0", "0", "1", "0", "1", "1", "0", "1", 
    "1", "0", "1", "0", "0", "0", "0", "1", "1", "0", "0", "1", 
    "1", "0", "1", "1", "0", "1", "1", "1", "1", "1", "1", "1", 
    "1", "0", "0", "0", "0", "0", "1", "1", "0", "0", "0", "1", 
    "1", "1", "1", "1", "1", "1", "1", "1", "1", "0", "1", "1", 
    "1", "1", "1", "0", "0", "1", "0", "1", "0", "1", "1", "0", 
    "0", "0", "1", "0", "0", "1", "1", "1", "1", "1", "1", "1", 
    "1", "1", "0", "0", "1", "1", "1", "1", "1", "1", "1", "1"
    ), c = c("Pat", "Ben", "Pat", "Pat", "Pat", "Pat", "Pat", 
    "Ben", "Ben", "Ben", "Ben", "Ben", "Ben", "Ben", "Ben", "Ben", 
    "Ben", "Ben", "Ben", "Ben", "Ben", "Ben", "Ben", "Ben", "Ben", 
    "Ben", "Ben", "Ben", "Pat", "Ben", "Pat", "Pat", "Ben", "Pat", 
    "Pat", "Pat", "Pat", "Pat", "Pat", "Pat", "Pat", "Ben", "Ben", 
    "Ben", "Ben", "Ben", "Pat", "Pat", "Pat", "Ben", "Ben", "Pat", 
    "Pat", "Pat", "Pat", "Pat", "Pat", "Pat", "Pat", "Pat", "Pat", 
    "Ben", "Pat", "Pat", "Pat", "Ben", "Pat", "Ben", "Ben", "Pat", 
    "Ben", "Pat", "Ben", "Pat", "Pat", "Ben", "Ben", "Ben", "Ben", 
    "Ben", "Ben", "Pat", "Pat", "Pat", "Pat", "Pat", "Pat", "Pat", 
    "Pat", "Pat", "Pat", "Pat", "Pat", "Pat", "Pat", "Pat", "Pat", 
    "Pat", "Pat", "Pat")), .Names = c("x", "y", "c"), row.names = c(NA, 
    100L), class = "data.frame"))

【问题讨论】:

  • 还有 NA 值。在代码中,并没有显示你想如何处理它
  • @akrun 是的应该提到。有 NA。如果该功能在完整的情况下运行,那很好。感谢您指出。

标签: r list function dataframe


【解决方案1】:

我们可以试试data.table

library(data.table)
rbindlist(my_list, idcol="grp")[,
     dam := Reduce(`+`, lapply(.SD, function(x) x==0 & !is.na(x))), .SDcols = 2:3
    ][, tol := Reduce(`+`, lapply(.SD, function(x) x==1 & !is.na(x))), .SDcols = 2:3
     ][, prop.concordant := 1][dam!=0, prop.concordant := dam/(dam + tol)
      ][,.(count = .N, complete_concordance_length = sum(prop.concordant ==1) ) , .(c, grp)]
#     c grp count complete_concordance_length
#1: Pat   1    57                          55
#2: Ben   1    43                          37
#3: Pat   2    57                          52
#4: Ben   2    43                          32

【讨论】:

  • 嗨@akrun,这行得通..谢谢!但是,当应用于 500 个数据帧的整个列表时,我收到以下错误:“'by' 或 'keyby' 的列或表达式 1 是内置类型。不要引用列名。用法:DT [,sum(colC) ,by=list(colA,month(colB))]"。错误源于运行代码的最后一点“[,.(count = .N, complete_concordance_length = sum(prop.concordant ==1)) , .(c, gap)]” ...rest 效果很好!我以前没有使用过 data.table,所以这可能是我很明显的遗漏。
  • @thisisrg 你能检查一下数据集列的类型是否相同
  • a sapply(my_list,function(x) x[]) 表明在列表中的所有数据帧中,前两列是字符,第三列是具有两个级别的因子(“Pat ”、“本”)。顺便说一句,我能够从代码的倒数第二步获取数据帧,并在 dplyr 中进行分组操作以获得我需要的内容。所以我接受这个答案。但最好弄清楚错误的含义
  • @thisisrg 我认为混合类可能造成了问题。让所有数据集具有相同的类可能会更好
猜你喜欢
  • 1970-01-01
  • 2011-05-02
  • 2020-08-22
  • 1970-01-01
  • 1970-01-01
  • 2016-06-18
  • 2021-11-24
  • 2021-01-04
  • 1970-01-01
相关资源
最近更新 更多