Posted at

長さの違うリストを一つのデータフレームにまとめたかった

More than 1 year has passed since last update.

長さの違う複数のリストを、一つのデータフレームにまとめたかった。

例えば、こんなリストをまとめようとした。

# 要素数の異なるリスト

a <- c(1,2,3)
b <- c(1,2,3,4,5,6,7)

そして、このリストを次のようにまとめようとすると、エラーになる。

A <- data.frame(a,b)

# Aの長さは3,Bの長さは7なのでエラー

短い方のリストをNAで埋めて、長さをそろえてやるとうまくいく。

c <- c(1,2,3,NA,NA,NA,NA)

#NAで埋めてあれば、要素数が揃うのでOK
B <- data.frame(a,c)

で、いちいち手でNAを入力するのがめんどくさかったので、こういうコードを書いた。


different_length.r

# 2つのリスト長の差を取る関数

diff_length <- function(list1,list2){
if(length(list1) > length(list2)){
return (length(list1) - length(list2))
}else{
return (length(list2) - length(list1))
}
}

# リストをNAで埋める関数
fill_by_na <- function(list, num){
return (c(list,rep(NA,num)))
}

# 上の関数を組み合わせてこうした
a <- c(1,2,3)
b <- c(1,2,3,4,5,6,7)

shortage <- diff_length(a,b) # 今回は4

fill_by_na(a,shortage)
# 1 2 3 NA NA NA NA

C <- data.frame(a = fill_by_na(a,shortage),b)
# a b
# 1 1 1
# 2 2 2
# 3 3 3
# 4 NA 4
# 5 NA 5
# 6 NA 6
# 7 NA 7


きっと、もっとうまくやる方法があると思うし、そもそもデータフレームの正しい使い方ではない気もする。コメント欄で正しいやり方をご指摘いただけると嬉しいです。