2017年1月29日

Rプログラム・長さの違う複数のベクトルの結合


複数のベクトルの結合には、cbind または rbind を用いる。

  • cbind: 各ベクトルをタテに並べていき、一つのデータフレームにする。
  • rbind: 各ベクトルをヨコに並べていき、一つのデータフレームにする。


このとき、結合する各ベクトルの長さは同じでなければならない。
もし長さが違う場合、短い方のベクトルは、
長さを満たすまで永遠にリピートして入力されてしまう。


x=c(1,1,1,1,1,1,1,1)
y=c(1,2,3)
z=cbind(x,y)
z

## 結果
 警告メッセージ:
In cbind(x, y) :
  number of rows of result is not a multiple of vector length (arg 2)
> z
     x y
[1,] 1 1
[2,] 1 2
[3,] 1 3
[4,] 1 1
[5,] 1 2
[6,] 1 3
[7,] 1 1
[8,] 1 2
>


こんなのは困る。
そこで、足りない部分にはNAを補ってデータフレームを作成したい。
パッケージを使えば色々手はあるようだが、手持ちだけでやりたい場合。
まず短いやつを長いやつのサイズまで伸ばしてやるのがコツ。

x=c(1,1,1,1,1,1,1,1)
y=c(1,2,3)

n <- max(length(x), length(y))
length(x)=n                    
length(y)=n

z=cbind(x, y)
z

## 結果
     x  y
[1,] 1  1
[2,] 1  2
[3,] 1  3
[4,] 1 NA
[5,] 1 NA
[6,] 1 NA
[7,] 1 NA
[8,] 1 NA
>

こうなる。


リストの各要素がベクトルで、
取り出してデータフレームにしたいなら、以下のとおり。

output=list(c(1:3), c(1:5), c(1:8))
output

[[1]]
[1] 1 2 3

[[2]]
[1] 1 2 3 4 5

[[3]]
[1] 1 2 3 4 5 6 7 8


## 各要素の最大長を求める

LENG=c()
for(i in 1:(length(output))){
 LLL=length(output[[i]])
 LENG=c(LENG,LLL)
 }
maxLENG=max(LENG)
maxLENG

[1] 8


## 各要素の長さを最大のサイズに変更
for(i in 1:(length(output))){
 length(output[[i]])=maxLENG
 }
output

[[1]]
[1]  1  2  3 NA NA NA NA NA

[[2]]
[1]  1  2  3  4  5 NA NA NA

[[3]]
[1] 1 2 3 4 5 6 7 8


## データフレームに結合
Data=do.call("cbind", output)
Data

     [,1] [,2] [,3]
[1,]    1    1    1
[2,]    2    2    2
[3,]    3    3    3
[4,]   NA    4    4
[5,]   NA    5    5
[6,]   NA   NA    6
[7,]   NA   NA    7
[8,]   NA   NA    8


以上