说我有两个向量v1
和v2
,并且我想打电话给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
- 有没有简单的方法我能阻止
v2
被回收,而是使剩余的条目0? - 有没有更好的方式来建立向量和矩阵?
所有的帮助感激!
使用以下命令:
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)))
如果您有许多载体,以rbind
寻求更长和更短的载体可能是乏味的。 在这种情况下,这是一个选项:
require(plyr)
rbind.fill.matrix(t(v1), t(v2))
要么,
rbind.fill(as.data.frame(t(v1)), as.data.frame(t(v2)))
虽然我认为里卡多提供了一个很好的解决方案,这样的事情也将工作应用功能,你希望绑定向量的列表。 你可以指定字符填充为好。
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