指定個数だけあるデータフレーム(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
〜追記〜
これでよかった。。。
ん、rep(list(mtcars[1:3, ]), 4) で駄目なんでしたっけ?
— むっくり活動開始 (@TobakuCptlsm) 2014, 11月 1