Jul*_*ien 6 r list 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")
Run Code Online (Sandbox Code Playgroud)
给出以下列表:
>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
首先要准备最终要cbind在一起的所有相同长度的特定向量,这需要给R多一点帮助。否则(如您所见),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
Run Code Online (Sandbox Code Playgroud)
编辑:正如Brian在评论中提到的那样,这可以变得更加紧凑(但要牺牲一些可读性)。您使用哪一个只是一个品味问题:
mat <- do.call("cbind", lapply(x, "[", spp))
row.names(mat) <- spp
Run Code Online (Sandbox Code Playgroud)
看起来你真的想要合并.因此,merge将工作.你只需告诉它合并名称,并保留所有行.
do.call(merge, c(x, by=0, all=TRUE)) # by=0 and by="row.names" are the same
Run Code Online (Sandbox Code Playgroud)
(这将创建一个数据框而不是矩阵,但对于大多数目的来说,这应该不是问题.)