はR

2017-03-14 6 views
0

に異なるセクションにランダムなアイテムを割り当てるI持って、次の集計値:はR

 section `n_distinct(item_code)` 
    <int>     <int> 
1  551      642 
2  552      609 
3  553      366 
4  554      445 
5  555      274 
6  556     1547 
7  557      227 
8  558      140 
9  559     5519 
10  560      5 
11  561      290 
12  562      147 
13  563      529 
14  NA     9758 

私はランダムに13個のいずれかのセクションにそれらの9758 item_codesのそれぞれを割り当てているやろうとしています。セクション全体に均等な分布を持つように条件を設定すると、セクション560はより多くのアイテムを取得し、セクション559はnoneを取得します。あなたのすべての協力に感謝します。

オブジェクトが分割されるように定義する:

+0

「ランダムに割り当てる」とはどういう意味ですか?アイテムが最初に560に割り当てられ、次に560が566に割り当てられ、その後560が147アイテムに割り当てられるように見えます。コードについては、何を試しましたか?あなたはどんな結果を望んでいますか? – Feng

+0

item_codeは行1:9758からのものですが、これらにはセクションが割り当てられていません。私はこれらを11のセクション(556と559を除く)に分割し、それらを残りのセクションに等しく割り当てようとしていました。条件付き、つまりSection555 item_code mickeyt500

+0

したがって、長さ9758のオーダーベクトルを割り当てることができますか? – Feng

答えて

1

ここsamplesplitを組み合わせた一つのアプローチです。 splitには、分割のグループ化を定義する要素が必要であると考えてください。グループ分けは1分13秒、9758回サンプリングして定義します。次に、これを使用してアイテムを分割します。この場合

set.seed(1) 
item_codes <- 1:9758 
split_factor <- sample(1:13, length(item_codes), replace=TRUE) 
item_codes_split <- split(item_codes, split_factor) 
item_codes_split 

あなたは、ランダムにあなたは非常に不均一なグループを取得しますそう、9758回を1時13サンプリングされている(あなたが述べたように、1つのグループはどれか、非常に少数を持っていません)しかし、あなたはまた、(絶対に等しいグループ化を得ることはありませんすなわち、各群において9758/13〜750-751)。この分布は、あなたが設定されているあなたのために働く場合

lengths(item_codes_split) 
1 2 3 4 5 6 7 8 9 10 11 12 13 
787 730 709 765 773 782 735 715 715 724 748 790 785 

あなたはすることにより、各グループ内にあるどのように多くの項目をチェックすることができます。それ以外の場合は、1〜9758のサンプルを置き換えずに750〜751のサイズでサンプリングし、リストからそれらのサンプリングされたアイテムを削除し、残りのサンプルを13個のグループになるまで繰り返しサンプリングします。

編集:上記のように、あまりにも上でこれを取ることにし、ここで我々は、ほぼ等しい長さの13基を有する:

set.seed(1) 
item_codes_split <- list() 
item_codes <- 1:9758 

9758/13 
# [1] 750.6154 
split_size <- c(rep(c(751, 750), times=6), 9758-751*6-750*6) 
split_size 
# [1] 751 750 751 750 751 750 751 750 751 750 751 750 752 

for (i in 1:13){ 
    item_codes_split[[i]] <- sample(item_codes, size=split_size[i], replace=FALSE) 
    item_codes <- item_codes[-item_codes_split[[i]]] 
} 
item_codes_split 

lengths(item_codes_split) 
# [1] 751 750 751 750 751 750 751 750 751 750 751 750 752 
1

以下のコードが割り当て順序のベクトルを生成する。

df <- data.frame(section = as.character(551:563), items= c(642,609,366,445,274,1547,227,140,5519,5,290,147,529),stringsAsFactors = F) 
#  section items 
#1  551 642 
#2  552 609 
#3  553 366 
#4  554 445 
#5  555 274 
#6  556 1547 
#7  557 227 
#8  558 140 
#9  559 5519 
#10  560  5 
#11  561 290 
#12  562 147 
#13  563 529 
# Your original data, 
df <- df[order(df$items),] 
steps <- diff(df$items)*seq(nrow(df)-1) 
assign_order <- numeric(0) 
for(i in seq(nrow(df)-1)){ 
    assign_order <- c(assign_order, sample(x=df$section[1:i], size =steps[i], replace = T)) 
} 
# The assign_order have a length of 61007, which means adding 61007 items will make all sections equal (to 5519). 
res <- assign_order[1:9758] # The assign order of your 9758 items. 

resの項目を割り当てると、セクション560〜140の項目が最初に入力され、セクション560とセクション558の両方が147の項目になるまで無作為に入力されます。最後に、すべてのセクションの項目(556と559を除く)はほぼ等しくなります。