1

可変数のビンにクラスター化された〜10 ^ 6値で構成されるデータセットに取り組んでいます。分析の過程で、クラスタリングをランダム化しようとしていますが、ビンのサイズは一定に保っています。おもちゃの例 (疑似コード) として、これは次のようになります。

data <- list(c(1,5,6,3), c(2,4,7,8), c(9), c(10,11,15), c(12,13,14));
sizes <- lapply(data, length);
for (rand in 1:no.of.randomizations) {
    rand.data <- partition.sample(seq(1,15), partitions=sizes, replace=F)
}

だから、私は "partition.sample" のような関数を探しています。これはベクトル (seq(1,15) など) を取り、そこからランダムにサンプリングし、"サイズ」。

タスクはそれほど難しくないように思われるので、私はそのような関数を自分で作成しようとしています。ただし、ベクトルを特定のビンサイズに分割することは、「ボンネットの下」で行うと、はるかに高速かつ効率的になるように見えます。つまり、おそらくネイティブ R ではそうではありません。関数、または誰かが周りのスマートなソリューションを教えてくれるかどうか:-)

あなたの助けと時間は非常に高く評価されています! :-)

一番、

ライモンド

更新

「ランダム化の回数」とは、「ランダム化ループ」全体を実際に実行した回数を意味します。これには、後で、実際のサンプリングだけでなく、より多くのステップが含まれることは明らかです。

さらに、上記の偉業を置き換えなしでサンプリングするためのトリックにも興味があります。

よろしくお願いします。

4

2 に答える 2

5

改訂: これはかなり効率的なはずです。その複雑さは、主に順列ステップにあるべきです:

# A single step:
x <- sample( unlist(data)) 
list( one=x[1:4], two=x[5:8], three=x[9], four=x[10:12], five=x[13:16]) 

上記のように、「no.of.randomizations」は、このプロセスの繰り返し適用の数である可能性があります。その場合、それをラップすることができますreplicate

replic <- replicate(n=4, { x <- sample(unlist(data))
   list( x[1:4], x[5:8], x[9], x[10:12], x[13:15]) }  )
于 2012-07-02T01:54:24.667 に答える
1

もう少し考えてグーグルした後、私は実行可能な解決策を思いつきました。しかし、これが最速で最も効率的な方法であるとはまだ確信していません。

原則として、「データ」の一意の順列の1つの長いベクトルを生成し、splitに提供された因数分解引数を使用して、長さ「サイズ」のベクトルのリストに分割できます。このために、「データ」のさまざまなグループに追加のIDスキームが必要です。これは、私の場合に発生します。

コードとして表示すると、より明確になります。

data <- list(c(1,5,6,3), c(2,4,7,8), c(9), c(10,11,15), c(12,13,14));
sizes <- lapply(data, length);

これまでのところ、上記のすべて

names <- c("set1", "set2", "set3", "set4", "set5");

私の場合、幸運にもデータから「名前」がすでに提供されています。そうでなければ、私はそれらを(例えば)として取得する必要があります

names <- seq(1, length(data));

この「名前」ベクトルは、repを使用して「サイズ」で展開できます。

cut.by <- rep(names, times = sizes);
[1] 1 1 1 1 2 2 2 2 3 4 4 4 5
[14] 5 5

この新しいベクトル「cut.by」は、split()への引数として提供できます。

rand.data <- split(sample(1:15, 15), cut.by)
$`1`
[1]  8  9 14  4
$`2`
[1] 10  2 15 13
$`3`
[1] 12
$`4`
[1] 11  3  5
$`5`
[1] 7 6 1

これは私が探していた仕事をうまくやってくれます。背景「1:15」からサンプリングし、結果をベクトル「cut.by」を介して長さ「サイズ」のベクトルに分割します。

ただし、上記のコードの「cut.by」など、分割された位置を示すために、追加の(場合によっては)長いベクトルを経由する必要があることには、まだ満足していません。これは間違いなく機能しますが、非常に長いデータベクトルの場合、かなり遅くなる可能性があると思います。

とにかく提供された答えとポインタをありがとう!あなたの助けは非常にありがたいです:-)

于 2012-07-03T10:55:27.950 に答える