Reputation: 606
I have a list of two data frames df1 and df2 (please see below for the data). For each data frame, I am trying to get two summary numbers 1) counts of Pat and Ben and 2) number of occurrences of concordance among columns a and b (0/0 or 1/1) for Pat and Ben. Using dplyr, I can get these numbers individually from the data frames like so (e.g. for df1 in the list below in dput(my_list)
:
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)))
which looks like this:
> final_table
# A tibble: 2 x 3
c count complete_concordance_num
<chr> <int> <int>
1 Ben 43 37
2 Pat 57 55
However, I am having problems implementing this over a list of data frames i.e. df1 and df2 in a list. Either lapply
or purrr::map
doesn't seem to work. The hurdle seems to be different column names (column 1 and 2) for each data frame. Really appreciate any clues!
Here is an test list (the actual list contains 500 data frames , each with different names of columns 1 and 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"))
Upvotes: 0
Views: 92
Reputation: 887098
We can try with 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
Upvotes: 1