6

假设我有两个向量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. 有没有更好的方法来构建向量和矩阵?

非常感谢所有帮助!

4

4 回答 4

19

使用以下内容:

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

因此,如果您通过较长的索引索引较短的索引,您将获得较短的所有值加上一系列NA


概括:

v <- list(v1, v2)
n <- max(lengths(v))
# same:
# n <- max(sapply(v, length))
do.call(rbind, lapply(v, `[`, seq_len(n)))
于 2013-05-15T04:07:13.233 回答
4

尽管我认为 Ricardo 提供了一个不错的解决方案,但类似这样的方法也可以将函数应用于您希望绑定的向量列表。您也可以指定要填充的字符。

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
于 2013-05-15T05:52:29.907 回答
3

如果您有很多向量来rbind查找更长和更短的向量可能会很乏味。在这种情况下,这是一个选项:

require(plyr)

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

或者,

rbind.fill(as.data.frame(t(v1)), as.data.frame(t(v2)))
于 2013-05-15T04:22:40.637 回答
1

transpose这是使用“data.table”的另一个选项:

library(data.table)
setDT(transpose(list(v1, v2)))[]
#    V1 V2 V3 V4 V5 V6 V7 V8
# 1:  1  2  3  4  8  5  3 11
# 2:  9  5  2 NA NA NA NA NA

transpose还有一个fill论点:

setDT(transpose(list(v1, v2), fill = 0))[]
#    V1 V2 V3 V4 V5 V6 V7 V8
# 1:  1  2  3  4  8  5  3 11
# 2:  9  5  2  0  0  0  0  0

如果你有许多以相同模式命名的向量——例如,你有 v1、v2、v3、...、v10——你可以使用mget

setDT(transpose(mget(paste0("v", 1:10))))[]
于 2020-08-04T04:19:02.140 回答