2017-02-03 3 views
0

Ich habe eine Liste von zwei Datenrahmen df1 und df2 (siehe unten für die Daten). Für jeden Datenrahmen versuche ich zwei zusammenfassende Zahlen zu erhalten: 1) Zählungen von Pat und Ben und 2) Anzahl von Konkordanzvorkommen zwischen den Spalten a und b (0/0 oder 1/1) für Pat und Ben. Mit dplyr, kann ich diese Zahlen bekommt einzeln aus dem Datenrahmen wie so (zB für df1 in der Liste unten in dput(my_list):Anwenden von Funktionen über eine Liste von Datenrahmen, um zusammenfassende Werte zu erhalten

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

, die wie folgt aussieht:

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

Ich bin jedoch mit Probleme, die dies über eine Liste von Datenrahmen dh df1 und df2 in einer Liste implementieren Entweder lapply oder purrr::map scheint nicht zu funktionieren.Die Hürde scheint zu verschiedenen Spaltennamen (Spalte 1 und 2) für jeden Datenrahmen zu sein Hinweise!

Hier eine Testliste ist (die aktuelle Liste enthält 500 Datenrahmen, die jeweils mit unterschiedlichen Namen der Spalten 1 und 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")) 
+0

Es versuchen, sind NA-Werte als Gut. In dem Code wird nicht gezeigt, wie Sie es behandeln wollen – akrun

+0

@akrun Ja sollte erwähnt haben. Es gibt NAs. Wenn die Funktion auf vollständigen Fällen funktioniert, ist das in Ordnung. Danke für das Aufzeigen. – thisisrg

Antwort

1

Wir können mit 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 
+0

Hallo @akrun, das funktioniert .. Danke! Bei der Anwendung auf die gesamte Liste von 500 Datenrahmen bekomme ich jedoch den folgenden Fehler: "Spalte oder Ausdruck 1 von 'by' oder 'keyby' ist Typ Built-in. Zitieren Sie keine Spaltennamen. Verwendung: DT [, sum (colC) , by = Liste (colA, Monat (colB))] ". Der Fehler rührt von der Ausführung des letzten Bits des Codes her "[,. (Count = .N, complete_concordance_length = sum (prop.concordant == 1)),. (C, lücke)]" ... Rest funktioniert großartig! Ich habe data.table vorher noch nicht benutzt, also kann das etwas offensichtlich sein, das ich vermisse. – thisisrg

+0

@thisisrg Können Sie überprüfen, ob die Dataset-Spalten den gleichen Typ haben – akrun

+0

ein Sapply (my_list, Funktion (x) x []) zeigt, dass in allen Datenrahmen in der Liste die ersten beiden Spalten Zeichen sind und die dritte Spalte ein Faktor mit zwei Ebenen ("Pat", "Ben"). BTW Ich war in der Lage, den Datenrahmen aus dem vorletzten Schritt Ihres Codes zu holen und die gruppierten Operationen in dplyr auszuführen, um zu bekommen, was ich brauchte. Also akzeptiere ich diese Antwort. Aber es wäre gut, herauszufinden, was der Fehler bedeutet – thisisrg

Verwandte Themen