6

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

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]]
>种.A种.C
> 1 4
>[[2]]
>种.A种.B种.C
> 3 19 11

使用 do.call 函数组合它们: y<- do.call(cbind,x)

给出:

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

虽然我想获得这个:

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

3 回答 3

5

看起来您实际上正在尝试进行合并。因此,merge将工作。您只需要告诉它合并名称并保留所有行。

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

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

于 2012-01-06T00:21:13.337 回答
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

编辑:正如布赖恩在评论中提到的,这可以变得更紧凑(但以牺牲一些可读性为代价)。您使用哪一个只是口味问题:

mat <- do.call("cbind", lapply(x, "[", spp))
row.names(mat) <- spp
于 2012-01-05T17:26:23.977 回答
1
merge(x = x[[1]], y = x[[2]], by = "names", all.y = TRUE)
于 2013-09-11T02:41:38.547 回答