Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 如何在R中的列表中组合不同长度的向量?_List_R_Numeric_Do.call - Fatal编程技术网

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)