【问题标题】:How to iteratively take random sample from R datatable until different column values equal sample size in R?如何迭代地从 R 数据表中抽取随机样本,直到不同的列值等于 R 中的样本大小?
【发布时间】:2017-04-11 04:06:57
【问题描述】:

我有一个类似的库存数据框:

set.seed(5)
library(data.table)

#replicated data
invntry <- data.table(
  warehouse <- sample(c("NY", "NJ"), 1000, replace = T),
  intid <- c(rep(1,150), rep(2,100), rep(3,210), rep(4,50), rep(5,80), rep(6,70), rep(7,140), rep(8,90), rep(9,90), rep(10,20)),
  placement <- c(1:150, 1:100, 1:210, 1:50, 1:80, 1:70, 1:140, 1:90, 1:90, 1:20),
  container <- sample(1:100,1000, replace = T),
  inventory <- c(rep(3242,150), rep(9076,100), rep(5876,210), rep(9572,50), rep(3369,80), rep(4845,70), rep(8643,140), rep(4567,90), rep(7658,90), rep(1211,20)),
  stock <- c(rep(3200,150), rep(10000,100), rep(6656,210), rep(9871,50), rep(3443,80), rep(5321,70), rep(8659,140), rep(4567,90), rep(7650,90), rep(1298,20)),
  risk <- runif(100)
)

setnames(invntry, c("warehouse", "intid", "placement", "container", "inventory", "stock", "risk"))
invntry[ , ticket := 1:.N, by=c("intid", "warehouse")]
invntry$ticket[invntry$warehouse=="NJ"] <- 0

#ensuring some same brands are same container
invntry$container[27:32] <- 6
invntry$container[790:810] <- 71
invntry[790:820,]

实际数据中有更多变量,我想使用这些变量来比较不同containers 中的相同项目itid。所以我想对每个项目的给定样本大小范围 n 进行多次试验,这样我就一直随机选择一个项目,直到我从不同的容器中获得 n 个项目,但如果它们已被选中,则保留重复项。因此,对于第 8 项的 6 样本大小,可能需要 7 次尝试才能获得 6 的样本大小:

    warehouse intid placement container inventory stock       risk    ticket
21: NY          8       10       71         4567  4567     0.38404806      5
22: NY          8       11       96         4567  4567     0.64665968      6
23: NJ          8       12       15         4567  4567     0.68265602      0
24: NY          8       13       19         4567  4567     0.84437586      7
21: NY          8       10       71         4567  4567     0.38404806      5
26: NY          8       15       34         4567  4567     0.69580270      8
28: NY          8       17       78         4567  4567     0.25352370      9

我尝试在此站点上进行搜索,但找不到上述内容以及想要从试验的行列中计算每个试验的一些值和样本大小的内容,所以我认为我必须使用 for循环,以便我可以区分每个样本大小的每个试验。总而言之,有两个目标:

  1. 对每个 itid 进行随机抽样 n 累积选择唯一容器,保持 itids 已被选中

  2. 能够针对每个项目的每个样本量对每个试验的变量进行计算

有什么想法吗?

*不必涉及data.table,就是这样开始的

(我认为这本质上是一个基本的概率示例,即继续从骨灰盒中抽取弹珠,直到你拥有所有不同颜色的样本大小——但即使意识到这也无助于我找到解决方案!)

【问题讨论】:

    标签: r random dataframe


    【解决方案1】:

    我不是肯定的,但这不等于按intid 分组,然后对n 个值进行替换采样,其中n 是某个整数?如果是这样,那么这是一种使用tidyverse 函数的方法。下面的代码按intid 分组,并从每组中替换 6 到 10 个值。 Sample_Size 列标识每个 intid 的每个 n 样本组:

    library(tidyverse)
    
    invntry.sampled = map_df(setNames(6:10, 6:10), 
                             ~ invntry %>% 
                               group_by(intid) %>% 
                               sample_n(.x, replace=TRUE),
                             .id="Sample_Size")
    

    这是一个data.table 方法,使用改编自this SO answer 的代码。我已经将data.table 代码包装在lapply 中以循环使用不同的样本大小,因为我的data.table 技能有限。 data.table 代码本身可能有办法做到这一点。

    invntry.sampled = do.call(rbind,
                              lapply(6:10, function(n) invntry[ , .SD[sample(.N, n, replace=TRUE)], by=intid]))
    

    【讨论】:

    • 感谢您的快速回复。它与我正在尝试的结果很接近,只是我希望为每个 itid 采样 n 个不同的 container 值,并在实现 n 个不同的值之前保持选择任何重复的 container 行。当我检查第一段代码时。 container 81 对 itid 1 进行了 2 次采样,两者都是样本大小 6 的一部分。在这种情况下,我想继续选择,直到为 itid==1 实现 6 个不同的 containers
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-24
    • 2022-12-17
    相关资源
    最近更新 更多