【问题标题】:Assigning Random Items to different sections in R将随机项分配给 R 中的不同部分
【发布时间】:2017-03-14 03:57:03
【问题描述】:

我总结了以下价值观:

       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_code 中的每一个随机分配给 13 个部分之一。希望设置一个条件,以便我们在各个部分之间进行平均分配,即第 560 节将获得更多项目,而第 559 节将一无所获。感谢您的所有帮助。

【问题讨论】:

  • “随机分配”是什么意思?似乎这些项目应该首先分配给 560,然后在 560 达到 147 个项目后分配给 560 和 562。对于代码,您尝试过什么?你想要什么结果?
  • item_codes 来自第 1:9758 行,这些没有分配给它们的部分。我打算将它们分成 11 个部分(不包括 556 和 559),并在其余部分中平均分配它们。我想知道是否可以根据条件分配它们,即如果 Section555 item_code
  • 那么,你想要一个长度为 9758 的分配顺序向量吗?

标签: r


【解决方案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 

如果这个发行版适合你,那么你就准备好了。否则,您必须定义一种不同类型的采样,在不替换的情况下对 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

【讨论】:

    【解决方案2】:

    下面的代码会生成一个赋值顺序的向量:

    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分配item,会先将section 560填入140个item,然后随机填入section 560和section 558,直到它们都有147个item,以此类推。最后,所有部分(556和559除外)的项目将大致相等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-18
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-04
      相关资源
      最近更新 更多