指定個数だけあるデータフレーム(data.frame)を要素にもつリスト(list)を作る関数

完全俺俺スニペットだし、本当にやりたいことはこの先にあるんだが、とりあえずのメモ。要するに以下のように動くrep関数

> rep(123, 4)
[1] 123 123 123 123

のデータフレーム版が欲しかったんだ。↓関数ご本尊。

make_list <- function(df, count){
  .make_list <- function(current, count){
    if(count==0){
      current
    }else{
      .make_list(c(list(df), current), count-1)
    }
  }
  .make_list(list(), count)
}

↓使ってみた結果。

> x <- make_list(mtcars[1:3,], 4)
> length(x)
[1] 4
> x
[[1]]
               mpg cyl disp  hp drat    wt  qsec vs am gear carb
Mazda RX4     21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
Datsun 710    22.8   4  108  93 3.85 2.320 18.61  1  1    4    1

[[2]]
               mpg cyl disp  hp drat    wt  qsec vs am gear carb
Mazda RX4     21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
Datsun 710    22.8   4  108  93 3.85 2.320 18.61  1  1    4    1

[[3]]
               mpg cyl disp  hp drat    wt  qsec vs am gear carb
Mazda RX4     21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
Datsun 710    22.8   4  108  93 3.85 2.320 18.61  1  1    4    1

[[4]]
               mpg cyl disp  hp drat    wt  qsec vs am gear carb
Mazda RX4     21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
Datsun 710    22.8   4  108  93 3.85 2.320 18.61  1  1    4    1

It works!!!

あぁ、関数名をrep.data.frameにしておくと、rep関数のS3オーバーロードだと思えて美しいか。というわけで、名前だけ修正。

rep.data.frame <- function(df, count){
  .make_list <- function(current, count){
    if(count==0){
      current
    }else{
      .make_list(c(list(df), current), count-1)
    }
  }
  .make_list(list(), count)
}

実行例

> rep(mtcars[1:3,], 2)
[[1]]
               mpg cyl disp  hp drat    wt  qsec vs am gear carb
Mazda RX4     21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
Datsun 710    22.8   4  108  93 3.85 2.320 18.61  1  1    4    1

[[2]]
               mpg cyl disp  hp drat    wt  qsec vs am gear carb
Mazda RX4     21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
Datsun 710    22.8   4  108  93 3.85 2.320 18.61  1  1    4    1

追記
これでよかった。。。