我想cbind
不同长度的不同向量。较短的那些(部分)回收,如香草cbind
:
cbind(c(1,2,3),c(4,5))
[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 4
Warning message:
In cbind(c(1, 2, 3), c(4, 5)) :
number of rows of result is not a multiple of vector length (arg 2)
除警告外,结果符合要求。由于我想在扩展中使用它,是否有可能抑制警告或更好:谁知道一个直接的解决方案产生相同的结果而没有警告! - 谢谢,S。
答案 0 :(得分:3)
这是一个选项,将关键概念包含在一个能够安排工作的功能中。最简单的方法是在rep()
的每个元素上使用...
将...
中的每个输入向量重复到一个公共长度(即最长输入向量的长度)。
这是我在下面使用length.out
的{{1}}参数。
rep()
这给出了:
CBIND <- function(..., deparse.level = 1) {
dots <- list(...) ## grab the objects passed in via ... this is a list
len <- sapply(dots, length) ## find lengths of individual vectors
## this applies rep() over dots extending each component vector to length
## of longest vector in ...
dots <- lapply(seq_along(dots),
function(i, x, len) rep(x[[i]], length.out = len),
x = dots, len = max(len))
## need to put everything together so arrange for a call to cbind
## passing the extended list of vectors and passing along
## the deparse.level argument of cbind
do.call(cbind, c(dots, deparse.level = deparse.level))
}
我肯定会赞成这一点而不是简单地用R> CBIND(c(1,2,3),c(4,5))
[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 4
R> CBIND(c(1,2,3),c(4,5), deparse.level = 2)
c(1, 2, 3) c(4, 5, 4)
[1,] 1 4
[2,] 2 5
[3,] 3 4
打扰警告。对于生产代码,您希望显式处理要允许的案例,并在用户已完成您未考虑的事项的情况下传播警告。
答案 1 :(得分:2)
如果您真的需要,可以使用suppressWarnings
:
suppressWarnings(cbind(c(1,2,3),c(4,5)))
# [,1] [,2]
# [1,] 1 4
# [2,] 2 5
# [3,] 3 4