簡體   English   中英

將函數應用於數據框列表以獲取摘要值

[英]Applying functions over a list of data frames to get summary values

我有兩個數據幀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"))

我們可以嘗試使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM