在R中将具有不同长度的矢量矩阵组合在一起

时间:2015-04-07 03:23:36

标签: r

我有两个向量a and b。它们都长10。然后我将它们组合成c。还有另一个向量d,其长度为20。尝试将它们组合在一起时,我收到了错误消息。我想知道是否有任何结构可以让我将不同长度的矢量组合在一起。

> a<-rep(6,10)
> b<-rep(8,10)
> c<-cbind(a,b)
> d<-rep(10,20)
> c
> x<-cbind(c,d)
  Warning message:
  In cbind(c, d) :
  number of rows of result is not a multiple of vector length (arg 2)

2 个答案:

答案 0 :(得分:2)

此处的问题是,您的c 不是向量。它是一个矩阵:

a <- rep(6,10);
b <- rep(8,10);
c <- cbind(a,b);
c;
##       a b
##  [1,] 6 8
##  [2,] 6 8
##  [3,] 6 8
##  [4,] 6 8
##  [5,] 6 8
##  [6,] 6 8
##  [7,] 6 8
##  [8,] 6 8
##  [9,] 6 8
## [10,] 6 8
c(typeof(c),mode(c),class(c));
## [1] "double"  "numeric" "matrix"

这是因为您通过cbind()两个向量一起创建了它。 cbind()表示&#34; column-bind&#34;,这意味着它将其操作数视为矩阵或data.frames并将它们的列粉碎在一起,因此您最终会得到更宽的矩阵或data.frame。如果两个操作数都是向量,则将它们视为此操作的单列矩阵。

现在,实际上, 可能cbind()带有矩阵的向量,但向量的长度应等于矩阵中的高度(即行数)或data.frame。演示:

d <- rep(10,10);
cbind(c,d);
##       a b  d
##  [1,] 6 8 10
##  [2,] 6 8 10
##  [3,] 6 8 10
##  [4,] 6 8 10
##  [5,] 6 8 10
##  [6,] 6 8 10
##  [7,] 6 8 10
##  [8,] 6 8 10
##  [9,] 6 8 10
## [10,] 6 8 10
cbind(d,c);
##        d a b
##  [1,] 10 6 8
##  [2,] 10 6 8
##  [3,] 10 6 8
##  [4,] 10 6 8
##  [5,] 10 6 8
##  [6,] 10 6 8
##  [7,] 10 6 8
##  [8,] 10 6 8
##  [9,] 10 6 8
## [10,] 10 6 8

出现了警告消息,因为您创建的d长度为20,当矩阵的高度为10. cbind()在技术上仍然成功(带警告),但只是截断新列 - 来自-vector与矩阵的高度相同:

d <- rep(10,20);
cbind(c,d);
##       a b  d
##  [1,] 6 8 10
##  [2,] 6 8 10
##  [3,] 6 8 10
##  [4,] 6 8 10
##  [5,] 6 8 10
##  [6,] 6 8 10
##  [7,] 6 8 10
##  [8,] 6 8 10
##  [9,] 6 8 10
## [10,] 6 8 10
## Warning message:
## In cbind(c, d) :
##   number of rows of result is not a multiple of vector length (arg 2)

如果您真的想要一个具有不同长度矢量的数据结构,那么您唯一的选择是列表:

a <- rep(6,10);
b <- rep(8,10);
d <- rep(10,20);
list(a=a,b=b,d=d);
## $a
##  [1] 6 6 6 6 6 6 6 6 6 6
## 
## $b
##  [1] 8 8 8 8 8 8 8 8 8 8
## 
## $d
##  [1] 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10

答案 1 :(得分:0)

如果您只想组合两个长度不等的数值向量,请使用c()运算符:

a <- rep(6,10)
d <- rep(10,20)
c <- c(a,d)

在这种情况下,c也是一个数字向量:

> c
 [1]  6  6  6  6  6  6  6  6  6  6 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10

但是如果你想让cbind()工作,那么你必须确保“d”小到可以回收:

a <- rep(6,10)
b <- rep(8,10)
c <- cbind(a,b)
d <- rep(10,5)
x <- cbind(c,d)

在这种情况下,x是一个矩阵,向量“d”被循环使用以匹配长度。

> x
      a b  d
 [1,] 6 8 10
 [2,] 6 8 10
 [3,] 6 8 10
 [4,] 6 8 10
 [5,] 6 8 10
 [6,] 6 8 10
 [7,] 6 8 10
 [8,] 6 8 10
 [9,] 6 8 10
[10,] 6 8 10