Help us understand the problem. What is going on with this article?

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

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

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away