2012-01-05 198 views
5

我结合包括在列表下面的载体时,有一个问题:如何在R中的列表中组合不同长度的向量?

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 

回答

4

你需要生成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 
+0

可在网上的X2分配,并简化为'do.call(cbind,lapply)' – 2012-01-05 17:35:05

+0

为了清楚起见,我突然分配了这个任务,并且为了清晰起见使得FUN定义更加明确,因为我认为公平地断定OP是一个相对的新手。但是,是的,这可以全部在一行中完成。实际上,我不妨将其添加为快速编辑。谢谢。 – 2012-01-05 17:39:15

+0

相当合理;我只是指出了一个选择。 – 2012-01-05 17:43:05

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 2013-09-11 02:59:06

相关问题