List 如何在R中的列表中组合不同长度的向量?
我在组合列表中包含的以下向量时遇到问题:List 如何在R中的列表中组合不同长度的向量?,list,r,numeric,do.call,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种。A种。C > 1 4 >[[2]] >物种A物种B物种C > 3
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种。A种。C
> 1 4
>[[2]]
>物种A物种B物种C
> 3 19 11
使用do.call函数组合它们:
yy
> [,1] [,2]
>物种A 1 3
>物种B 4 19
>物种C 1 11
虽然我想获得以下信息:
> [,1] [,2]
> species.A 1 3
> species.B NA 19
> species.C 4 11
> [,1] [,2]
>物种A 1 3
>物种B NA 19
>物种C 4 11
你需要给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
spp看起来您实际上在尝试合并。因此,merge
将起作用。您只需告诉它合并名称,并保留所有行
do.call(merge, c(x, by=0, all=TRUE)) # by=0 and by="row.names" are the same
(这将创建一个数据帧而不是一个矩阵,但在大多数情况下,这不应该是一个问题。)可以将x2赋值串联起来,并将其简化为do.call(cbind,lappy(x,'[',spp))
为了清晰起见,我打断了作业,并将有趣的定义更加明确,因为我认为得出OP是一个相对新手的结论是公平的。但是,是的,这一切都可以在一行中完成。事实上,我不妨添加它作为一个快速编辑。谢谢。@BrianDiggs——没问题。这是一个很好的建议,也是一个简单的例子这里是介绍这两种技术的最佳场所。再次感谢。太好了!谢谢大家。两种选择都很有趣,第一种是理解技巧的,第二种是包含在我的时间消耗分析中的。再次感谢!@Julien——既然这有帮助,你可以通过点击左边的复选标记来“接受”答案。谢谢。大家好,欢迎来到SO。在纯代码答案中添加一些解释是一个非常好的练习。
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
do.call(merge, c(x, by=0, all=TRUE)) # by=0 and by="row.names" are the same
merge(x = x[[1]], y = x[[2]], by = "names", all.y = TRUE)