複数のベクトルの結合には、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
以上