全体を置き換えずに、大きなリストから10個のサンプルを多数取り出す方法


12

大量のデータセット(20,000データポイント)があり、そこから10データポイントの繰り返しサンプルを取得します。ただし、これらの10個のデータポイントを選択したら、それらを再度選択しないようにします。

sample関数を使用してみましたが、関数の複数の呼び出しを置き換えずにサンプリングするオプションがないようです。これを行う簡単な方法はありますか?

回答:


9

データセット全体でsampleを1回呼び出して、並べ替えることができます。その後、サンプルを取得する場合は、最初の10個を取得できます。別のサンプルが必要な場合は、次の10個を取得します。


9

Rで実装されたDasonの考え:

sample <- split(sample(datapoints), rep(1:(length(datapoints)/10+1), each=10))
sample[[13]] # the thirteenth sample

(+1)本当にきちんとしたRコード。注目すべきことに、が奇数の場合は機能しません。n
CHL

@chlありがとう!しかし、私はそれがうまくいくと思います。タスクは、一連のデータポイントからサイズ10のサンプルを提供することでした。n = length(datapoints)と仮定します。コードは、そのようなサンプルの最大数(n%/%10)を示します。最初のコーナーケースはn <10です(とにかく、問題の説明では、データセットを「大きい」、つまりn> 10と記述して除外しています)。その場合、データポイントが返され、警告(エラーではない)が返されます。2番目のコーナーケースは、ダングリングエレメントがある場合です(n %% 10!= 0の場合)。次に、できるだけ多くのサンプルと警告(エラーではない)を取得します。これら2つのケースのいずれかで奇数nの状況が包含されます。
2010年

リストの最初の要素は10ではなく長さ11でsum(unlist(lapply(sample, length)))、長さdatapoints(1001に設定)を返します。
2010年

@chlくそー!あなたはまったく正しい。
2010年

2

これはうまくいくはずです:

x <- rnorm(20000)
x.copy <- x
samples <- list()
i <- 1
while (length(x) >= 10){
    tmp <- sample(x, 10)
    samples[[i]] <- tmp
    i <- i+1
    x <- x[-match(tmp, x)]
}

table(unlist(samples) %in% x.copy)

しかし、私はそれが最もエレガントな解決策だとは思いません...


1

@conjugatepriorあなたの答えは正しい方向に進んでいます。しかし、少なくとも現在のRバージョン3.4.3では機能しません。ただし、いくつかの調整を行うと機能します。

mysample<-split(sample(length(datapoints)), 1:10)
mysample[[9]] ## the ninth sample

まだコメントできないので、ここで回答することにしました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.