如何在R中的列表中组合不同长度的向量?

时间:2012-01-05 17:08:44

标签: list r numeric do.call

组合列表中包含的以下向量时遇到问题:

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 个答案:

答案 0 :(得分:5)

你需要给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

编辑:正如Brian在评论中提到的那样,这可以更加紧凑(但是以牺牲一些可读性为代价)。你使用哪一个只是一个品味问题:

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

答案 1 :(得分:5)

看起来你真的想要合并。因此,merge将起作用。你只需告诉它合并名称,并保留所有行。

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

(这将创建一个数据框而不是矩阵,但对于大多数目的而言,这不应该是一个问题。)

答案 2 :(得分:1)

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