将随机项分配给R中的不同部分

时间:2017-03-14 03:57:04

标签: 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

我要做的是将这些9758 item_codes中的每一个随机分配给13个部分中的一个。希望设置一个条件,以便我们在各个部分之间具有相同的分布,即第560部分将获得更多项目,而部分559将不会获得任何项目。谢谢你的帮助。

2 个答案:

答案 0 :(得分: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

在这种情况下,你随机抽样1:13,9758次,不太可能你会得到非常不均匀的分组(一组没有或很少如你所述)但你也不会得到绝对平等的分组(即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 

如果此分发适用于您,那么您已设置。否则你必须定义一种不同类型的采样,你可以在不更换的情况下对大小为750-751的1:9758进行采样,从列表中删除那些采样项,然后再迭代地对剩余采样进行采样,直到你有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 :(得分: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除外)大致相等。