【问题标题】:Need to randomly sample a data set with multiple groups each with multiple factors需要随机抽样具有多个组的数据集,每个组具有多个因素
【发布时间】:2015-03-03 23:32:56
【问题描述】:

更新问题 我忽略了在我最初的问题中包含一个重要方面。 @Jthorpe 提供的代码适用于 STUFF 的一列。但是,根据我的数据集,我将一次随机抽样 1 到 70 列。在我更新的示例中,我包含了 3 列 STUFF。所以我需要group_bySITEDATE,然后从STUFF的多列中随机sample一行。请注意RESULT 表如何保留STUFF 列之间的数据顺序。例如,RESULT 表中的前两行都是 2,4,8,对应于DATA 表中的第 2 行。我希望这很清楚。再次感谢。

原始问题 我需要伪复制一个可能有多个组的数据集。此外,每个组可能有多个因素。我已经使用 for 循环编写了代码来对数据集进行子集化,然后对子集进行随机采样,然后将重新采样的数据集重新组合到一个新表中。我想使用一些更优雅和灵活的代码。我曾尝试使用 dplyr(例如 group_by 和 sample_n 函数),但无法让代码正确处理因子中的可变长度。我附上了一个示例数据集和所需的结果。提前感谢您的帮助。

DATA = data.frame(SITE = c("A","A","A","A","B","B","B","C","C"), 
                  DATE = c("1","1","2","2","3","3","3","4","4"), 
                  STUFF = c(1, 2, 30, 40, 100, 200, 300, 5000, 6000),
                  STUFF2 = c(2, 4, 60, 80, 200, 400, 600, 10000, 12000),
                  STUFF3 = c(4, 8, 120, 160, 400, 800, 1200, 20000, 24000))



 RESULT = data.frame(SITE = c("A","A","A","A","B","B","B","C","C"), 
                    DATE = c("1","1","2","2","3","3","3","4","4"), 
                    STUFF = c(2, 2, 30, 30, 200, 300, 300, 6000, 5000),
                    STUFF2 = c(4, 4, 60, 60, 400, 600, 600, 12000, 10000),
                    STUFF3 = c(8, 8, 120, 120, 800, 1200, 1200, 24000, 20000))

【问题讨论】:

  • 您想从STUFF 中采样,同时按SITEDATE 分组?
  • 是的。我想按 SITE 和 DATE 分组并随机抽样 STUFF。对不起...我应该在文本中更清楚一点。
  • 您可能需要查看sampling 包以获得更彻底的测试解决方案。
  • 你的意思是更彻底的测试解决方案?我将检查以确保“样本”功能正确地对我的组进行抽样。谢谢。

标签: r


【解决方案1】:

dplyr 解决方案:

RESULT <- DATA %>% group_by(SITE,DATE) %>% mutate(STUFF=sample(STUFF,replace= TRUE))

【讨论】:

  • 嗯....那个代码比油腻的猫屎还要光滑。我写的原始代码是一系列嵌套的 for 循环……使用起来很头疼。谢谢!
  • 多么棒的类比。
【解决方案2】:

这是一个简单的data.table 方法

library(data.table)
setDT(DATA)[, sample(STUFF, replace = TRUE), by = .(SITE, DATE)]

【讨论】:

    猜你喜欢
    • 2018-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-17
    • 2014-10-15
    • 1970-01-01
    相关资源
    最近更新 更多