まず、データフレームのリストの小さな例を次に示します。
# create some sample data
whaledatas <- list(
data.frame(x=1:3, y=11:13),
data.frame(x=6:10, y=16:20)
)
for
これは元の質問のループと同じことだと思いますか?
# combine into single data frame
whaledatas.all <- do.call("rbind", whaledatas)
# change this to 200! kept small here for illustration...
XMAX <- 10
# create output matrix
dat <- matrix(0.0, length(whaledatas), XMAX)
# create index vector for dat rows
i <- rep(1:length(whaledatas), sapply(whaledatas, nrow))
# populate dat
dat[cbind(i, whaledatas.all[["x"]])] <- whaledatas.all[["y"]]
編集
入力のrbind
数が増えると、はひどく遅くなります。このバージョン(便宜上関数にラップされている)はそれを回避し、はるかに高速に実行されます。
datify <- function(x, xmax=200) {
dat <- matrix(0.0, length(x), xmax)
for (i in seq_along(x)) {
this.df <- x[[i]]
coords <- cbind(rep(i, nrow(this.df)), this.df[["x"]])
dat[coords] <- this.df[["y"]]
}
dat
}
ですべてゼロから始めたdat
ので、事後にそれを修正する必要はないことに注意してください...
> datify(whaledatas, xmax=10)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 11 12 13 0 0 0 0 0 0 0
[2,] 0 0 0 0 0 16 17 18 19 20
my_sampler
Arunの関数を使用して生成されたサンプルデータフレームの30kの長さのリストのタイミング:
set.seed(99)
in.d <- lapply(1:30000, function(x) my_sampler(x))
system.time(dat <- datify(in.d, xmax=200))
## user system elapsed
## 1.317 0.011 1.328