2016-05-26 11 views
4

In meinem realen Daten habe ich warning number of columns of result is not a multiple of vector length (arg 1), obwohl meine Liste eine eindeutige Nummer von cols hat, wenn ich do.call("rbind" verwendetwas entspricht do.call (rbind, list)?

Ich möchte etwas anderes versuchen, die die gleiche Ausgabe wie do.call (rbind, Liste) produzieren zu überprüfen Wohin das Problem in meiner Liste ist oder nicht.

Beispiel

 n = c(2, 3, 5,4) 
     n1 = c(2, 7, 4,6) 
     n2 = c(NA, NA, NA,NA) 
     x = list(n, n1, n2) 
     dat <- do.call("rbind", x) 

Ich versuchte dies:

 df=matrix(as.numeric(unlist(x)), nrow= 3) 

aber

 identical(dat,df) 
    > identical(dat,df) 
     [1] FALSE 

PS: Ich möchte nicht die class or str of my list

Antwort

6

einfach eine Anmerkung ändern: Loo König bei

> dat 
    [,1] [,2] [,3] [,4] 
[1,] 2 3 5 4 
[2,] 2 7 4 6 
[3,] NA NA NA NA 
> df 
    [,1] [,2] [,3] [,4] 
[1,] 2 4 4 NA 
[2,] 3 2 6 NA 
[3,] 5 7 NA NA 

Ich bin nicht überrascht über das Ergebnis, dass

identical(dat,df) 
[1] FALSE 

Allerdings sehen

df=matrix(as.numeric(unlist(x)), nrow= 3, byrow = T) 
identical(dat,df) 
[1] TRUE 

Alternativen zu do.call(rbind, list)

Wenn Sie eine suchen Alternative zu do.call, sehen Sie sich dplyr::bind_rows an (die Datenframes unterstützt und recht effizient ist). Eine zweite Alternative kann Reduce sein, wie in:

Reduce(rbind, x) 
    [,1] [,2] [,3] [,4] 
init 2 3 5 4 
     2 7 4 6 
     NA NA NA NA 

Eine weitere Alternative ist data.table::rbindlist, die auf einer Liste Feeds (!). Beachten Sie jedoch, dass die Ausgabe transponiert wird, was bedeutet, dass jede Zeile als eine Spalte erscheint. Siehe

library(data.table) 
rbindlist(list(x)) 
    V1 V2 V3 
1: 2 2 NA 
2: 3 7 NA 
3: 5 4 NA 
4: 4 6 NA 

Sie es in t() wickeln kann das Ergebnis transponieren, though.

Allgemeiner gesagt, obwohl, wenn Sie, wenn alle Elemente in Ihrer Liste überprüfen mögen die gleiche Länge haben, können Sie den Fehler mit so etwas wie

sapply(x, length) 
[1] 4 4 4 

oder je nachdem, wie bei der Suche nach erfolgreicher sein könnten tatsächliche Daten sieht wie eine Variante wie ncol oder so statt length aus. Wenn die Listenelemente Spaltennamen haben, kann names ebenfalls eine gültige Alternative sein.

4

Sie müssen byrow = TRUE hinzuzufügen:

df=matrix(as.numeric(unlist(x)), nrow= 3, byrow = TRUE)