cbind任意长度的向量,没有警告

时间:2012-11-13 09:50:24

标签: r

我想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。

2 个答案:

答案 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