Rがどのように機能するかにより、これはおそらく非常に高速なオプションになります。
まず、いくつかのサンプルデータ:
set.seed(1)
dat <- data.frame(x = rep(1:10, times = sample(10:30, 10)))
dat$y <- rnorm(nrow(dat))
次に、z
すべての値を持つ変数を作成しますFALSE
。
dat$z <- FALSE
rle
およびを使用cumsum
してサンプルを把握し、それらをサブセット化し、としてマークを付けますTRUE
。
RLE = c(1, cumsum(rle(dat$x)$lengths))
dat$z[c(sapply(1:(length(RLE)-1),
function(x) sample(RLE[x]:RLE[x+1], 10)))] <- TRUE
ベンチマーク、誰か?
この投稿のサンプルデータを使用して、DWinのソリューション、themelのソリューション、この基本的なサブセット化ソリューション、およびベースRの他の2つのオプションを比較します。
library(rbenchmark)
benchmark(BY = do.call(rbind,
by(dat, dat$x,
FUN = function(i) {
i$z <- FALSE;
i[sample(nrow(i), 10), "z"] <- TRUE;
i })),
LAPPLY = do.call(rbind,
lapply(split(dat, dat$x),
FUN = function(i) {
i$z <- FALSE;
i[sample(nrow(i), 10), "z"] <- TRUE;
i })),
SUBSET = {
RLE = c(1, cumsum(rle(dat$x)$lengths));
dat$z <- FALSE;
dat$z[c(sapply(1:(length(RLE)-1),
function(x)
sample(RLE[x]:RLE[x+1], 10)))] <- TRUE },
DDPLY = ddply(df, "x" , function(df) {
pick <- rep(FALSE,nrow(df));
pick[sample(nrow(df),10)] = TRUE;
cbind(df, "z"=pick)
}),
AVE = { dat$z <- FALSE;
ave(dat$x, dat$x,
FUN=function(x)
sample(c(rep(TRUE, 10), rep(FALSE, length(x)-10))))},
columns = c("test", "replications", "elapsed",
"relative", "user.self"),
order = "relative")
# test replications elapsed relative user.self
# 3 SUBSET 100 0.044 1.000000 0.044
# 5 AVE 100 0.078 1.772727 0.080
# 2 LAPPLY 100 0.601 13.659091 0.600
# 1 BY 100 0.675 15.340909 0.680
# 4 DDPLY 100 6.016 136.727273 6.008