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

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]]
>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个回答

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

可以将x2赋值内联并简化为do.call(cbind, lapply(x,'[',spp)) - Brian Diggs
我将任务分解,并为了清晰起见,使FUN定义更加明确,因为我认为可以得出结论,OP是一个相对新手。但是,是的,这一切都可以在一行代码中完成。实际上,我可能会将其作为快速编辑添加。谢谢。 - Josh O'Brien
@BrianDiggs -- 没问题。这是一个好建议,而像这样的简单示例是介绍这两种技术的最佳场所。再次感谢您。 - Josh O'Brien
太好了!谢谢大家。两个选项都很有趣,第一个是为了理解技巧,第二个是为了包含在我的耗时分析中。再次感谢! - Julien
@Julien -- 既然这个回答有帮助,你可以点击左侧的复选框“接受”该答案。谢谢。 - Josh O'Brien

5

看起来你实际上是在尝试合并数据。因此,merge 命令将适用。你只需要告诉它按照名称进行合并,并保留所有行。

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

这将创建一个数据框而不是矩阵,但对于大多数情况,这应该不是问题。


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

1
你好,欢迎来到SO。在代码回答中添加一些解释是一个非常好的实践。 - Fluffeh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接