我有以下汇总值:
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将不会获得任何项目。谢谢你的帮助。
答案 0 :(得分:1)
以下是一种结合sample
和split
的方法:
定义要拆分的对象。考虑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除外)大致相等。