長さの違う複数のリストを、一つのデータフレームにまとめたかった。
例えば、こんなリストをまとめようとした。
# 要素数の異なるリスト
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
きっと、もっとうまくやる方法があると思うし、そもそもデータフレームの正しい使い方ではない気もする。コメント欄で正しいやり方をご指摘いただけると嬉しいです。