R和rbind使条目不相同的长度是零(R and rbind making entries with

2019-09-03 06:39发布

说我有两个向量v1v2 ,并且我想打电话给rbind(v1, v2) 然而,假定length(v1) > length(v2) 从文档我已阅读,较短的矢量将被回收。 下面是这个“循环”的例子:

> v1 <- c(1, 2, 3, 4, 8, 5, 3, 11)
> v2 <- c(9, 5, 2)
> rbind(v1, v2)
   [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
v1    1    2    3    4    8    5    3   11
v2    9    5    2    9    5    2    9    5
  1. 有没有简单的方法我能阻止v2被回收,而是使剩余的条目0?
  2. 有没有更好的方式来建立向量和矩阵?

所有的帮助感激!

Answer 1:

使用以下命令:

rbind(v1, v2=v2[seq(v1)])

   [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
v1    1    2    3    4    8    5    3   11
v2    9    5    2   NA   NA   NA   NA   NA

为什么它的工作原理:通过比其长度大的值索引一个向量返回该索引点NA的值。

 #eg: 
{1:3}[c(3,5,1)]
#[1]  3 NA  1

因此,如果指数的一个较长的indecies中较小的一个,你预订购获得所有的值中较小的一个加了一系列的NA


一个推广:

v <- list(v1, v2)
n <- max(sapply(v, length))
do.call(rbind, lapply(v, `[`, seq_len(n)))


Answer 2:

如果您有许多载体,以rbind寻求更长和更短的载体可能是乏味的。 在这种情况下,这是一个选项:

require(plyr)

rbind.fill.matrix(t(v1), t(v2))

要么,

rbind.fill(as.data.frame(t(v1)), as.data.frame(t(v2)))


Answer 3:

虽然我认为里卡多提供了一个很好的解决方案,这样的事情也将工作应用功能,你希望绑定向量的列表。 你可以指定字符填充为好。

test <- list(v1,v2)
maxlen <- max(sapply(test,length))
fillchar <- 0
do.call(rbind,lapply(test, function(x) c(x, rep(fillchar, maxlen - length(x) ) )))

或避免所有do.call(rbind疯狂:

t(sapply(test, function(x) c(x, rep(fillchar, maxlen - length(x)))))

#     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
#[1,]    1    2    3    4    8    5    3   11
#[2,]    9    5    2    0    0    0    0    0


文章来源: R and rbind making entries without the same length be zero