6 Stimmen

Wie kombiniert man Vektoren mit unterschiedlicher Länge in einer Liste in R?

Ich habe ein Problem bei der Kombination der folgenden Vektoren in der Liste:

x <- list(as.numeric(c(1,4)),as.numeric(c(3,19,11)))
names (x[[1]]) <- c("species.A","species.C")
names (x[[2]]) <- c("species.A","species.B","species.C")

die die folgende Liste enthält:

\>x
>\[\[1\]\]
>species.A species.C 
>         1         4 
>\[\[2\]\]
>species.A species.B species.C 
>        3        19        11 

sie mit der Funktion do.call zu kombinieren: y<- do.call(cbind,x)

gibt:

\>y
>             \[,1\] \[,2\]
>   species.A    1    3
>   species.B    4   19
>   species.C    1   11

während ich dies gerne erhalten würde:

\>             \[,1\] \[,2\]
>   species.A    1    3
>   species.B   NA   19
>   species.C    4   11

5voto

Josh O'Brien Punkte 154170

Sie müssen R etwas mehr Hilfe geben, indem Sie zunächst die einzelnen Vektoren vorbereiten, die alle die gleiche Länge haben und die Sie schließlich cbind zusammen. Andernfalls (wie Sie gesehen haben) verwendet R seine üblichen Recyclingregeln, um die Matrix auszufüllen.

Versuchen Sie so etwas:

spp <- paste("species", c("A", "B", "C"), sep=".")

x2 <- lapply(x, FUN=function(X) X[spp])
mat <- do.call("cbind", x2)
row.names(mat) <- spp

mat
          [,1] [,2]
species.A    1    3
species.B   NA   19
species.C    4   11

EDIT : Wie Brian in den Kommentaren erwähnt, könnte dies etwas kompakter gestaltet werden (allerdings auf Kosten einer gewissen Lesbarkeit). Welche Sie verwenden, ist reine Geschmackssache:

mat <- do.call("cbind", lapply(x, "[", spp))
row.names(mat) <- spp

5voto

Hong Ooi Punkte 54641

Es sieht so aus, als ob Sie tatsächlich versuchen, eine Verschmelzung durchzuführen. Als solches, merge wird funktionieren. Sie müssen dem Programm nur sagen, dass es die Namen zusammenführen und alle Zeilen behalten soll.

do.call(merge, c(x, by=0, all=TRUE))   # by=0 and by="row.names" are the same

(Dadurch wird ein Datenrahmen anstelle einer Matrix erstellt, aber für die meisten Zwecke sollte das kein Problem sein).

1voto

user2759975 Punkte 71
merge(x = x[[1]], y = x[[2]], by = "names", all.y = TRUE)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X