Как объединить векторы с различной длиной в списке в R? - PullRequest
6 голосов
/ 05 января 2012

У меня проблема при объединении следующих векторов, включенных в список:

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

, что дает следующий список:

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

, объединяя их с помощью функции do.call:y<- do.call(cbind,x)

дает:

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

, в то время как я хотел бы получить это:

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

Ответы [ 3 ]

5 голосов
/ 06 января 2012

Похоже, вы на самом деле пытаетесь сделать слияние. Таким образом, merge будет работать. Вы просто должны сказать это, чтобы объединить имена и сохранить все строки.

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

(Это создаст кадр данных, а не матрицу, но для большинства целей это не должно быть проблемой.)

5 голосов
/ 05 января 2012

Вам нужно оказать R немного больше помощи, сначала подготовив конкретные векторы, все одинаковой длины, которые вы в конечном итоге захотите собрать вместе cbind. В противном случае (как вы видели) R использует свои обычные правила переработки для заполнения матрицы.

Попробуйте что-то вроде этого:

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

РЕДАКТИРОВАТЬ : Как упоминает Брайан в комментариях, это можно сделать более компактным (но за счет некоторой читабельности). Какой из них вы используете - дело вкуса:

mat <- do.call("cbind", lapply(x, "[", spp))
row.names(mat) <- spp
1 голос
/ 11 сентября 2013
merge(x = x[[1]], y = x[[2]], by = "names", all.y = TRUE)
...