【问题标题】:dplyr: random sampling procedure for blocks of rows (multiple grouping variables and data columns)dplyr:行块的随机抽样程序(多个分组变量和数据列)
【发布时间】:2016-05-03 23:52:53
【问题描述】:

我的数据集包含 1 到 70 列数据和 1 到 5 列 ID 变量。我需要按 ID 变量分组,然后在 ID 变量中随机抽取行块。重新采样的数据集需要与原始数据集的长度相同。

下面是带有所需结果表的示例数据集。因此,我需要按SITEDATE 分组,然后随机抽样与每个INDIV 关联的三行块(aqun/aterr)。请注意CATEGORY 顺序如何保留在 RESULT 表中(例如,aqun/aterr)。

我需要使用dplyr,因为这个随机抽样程序将数据输入到更大的for 循环中,该循环使用dplyr 函数进行各种计算……而且你们中的许多人都知道dplyr 掩盖了其他包中的各种函数.对于将原始表复制并粘贴到此问题中,我深表歉意,但这是复制数据集复杂性的最简单方法。提前致谢。

数据

SITE    DATE    INDIV   CATEGORY    BIOMASS LENGTH
GC  Oct A   aqu 0.0002  10
GC  Oct A   n/a 0   0
GC  Oct A   terr    0   0
GC  Oct B   aqu 0   0
GC  Oct B   n/a 0   0
GC  Oct B   terr    0   0
GC  Oct C   aqu 0.1875  20
GC  Oct C   n/a 0   0
GC  Oct C   terr    0.5424  30
GC  Aug D   aqu 7.4888  10
GC  Aug D   n/a 0   0
GC  Aug D   terr    100.9245    5
GC  Aug E   aqu 0.0001  1
GC  Aug E   n/a 0   0
GC  Aug E   terr    0   0
GC  Aug F   aqu 0   0
GC  Aug F   n/a 0   0
GC  Aug F   terr    20.593  10
NSVhi   Oct A   aqu 5.8713  5
NSVhi   Oct A   n/a 0   0
NSVhi   Oct A   terr    13.8651 3
NSVhi   Oct B   aqu 17.2288 2
NSVhi   Oct B   n/a 0   0
NSVhi   Oct B   terr    0   0
NSVhi   Oct C   aqu 22.7558 1
NSVhi   Oct C   n/a 0   0
NSVhi   Oct C   terr    24.7843 6
NSVhi   Aug D   aqu 0   0
NSVhi   Aug D   n/a 0   0
NSVhi   Aug D   terr    31.9222 7
NSVhi   Aug E   aqu 0.046   10
NSVhi   Aug E   n/a 0   0
NSVhi   Aug E   terr    0   0
NSVhi   Aug F   aqu 2.1156  5
NSVhi   Aug F   n/a 0   0
NSVhi   Aug F   terr    0   0

结果

SITE    DATE    INDIV   CATEGORY    BIOMASS LENGTH
GC  Oct C   aqu 0.1875  20
GC  Oct C   n/a 0   0
GC  Oct C   terr    0.5424  30
GC  Oct C   aqu 0.1875  20
GC  Oct C   n/a 0   0
GC  Oct C   terr    0.5424  30
GC  Oct A   aqu 0.0002  10
GC  Oct A   n/a 0   0
GC  Oct A   terr    0   0
GC  Aug D   aqu 7.4888  10
GC  Aug D   n/a 0   0
GC  Aug D   terr    100.9245    5
GC  Aug F   aqu 0   0
GC  Aug F   n/a 0   0
GC  Aug F   terr    20.593  10
GC  Aug D   aqu 7.4888  10
GC  Aug D   n/a 0   0
GC  Aug D   terr    100.9245    5
NSVhi   Oct B   aqu 17.2288 2
NSVhi   Oct B   n/a 0   0
NSVhi   Oct B   terr    0   0
NSVhi   Oct C   aqu 22.7558 1
NSVhi   Oct C   n/a 0   0
NSVhi   Oct C   terr    24.7843 6
NSVhi   Oct A   aqu 5.8713  5
NSVhi   Oct A   n/a 0   0
NSVhi   Oct A   terr    13.8651 3
NSVhi   Aug D   aqu 0   0
NSVhi   Aug D   n/a 0   0
NSVhi   Aug D   terr    31.9222 7
NSVhi   Aug D   aqu 0   0
NSVhi   Aug D   n/a 0   0
NSVhi   Aug D   terr    31.9222 7
NSVhi   Aug D   aqu 0   0
NSVhi   Aug D   n/a 0   0
NSVhi   Aug D   terr    31.9222 7

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    这听起来像你想要的......

    library(dplyr)
    dat <- group_by(DATA, SAMPLE, CATEGORY)
    sample_df <- distinct(sample_n(dat, 3, replace = T))
    

    但我认为这更有意义......

    dat <- group_by(DATA, CATEGORY)
    sample_df <- sample_n(dat, 3)
    

    再说一次,我不知道究竟你想要什么。希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      data.table:

      library(data.table)
      setDT(DATA, key = "SAMPLE")
      
      set.seed(12030)
      DATA[.(sample(unique(SAMPLE), rep = TRUE))]
      #    SAMPLE CATEGORY BIOMASS
      # 1:      B        1      10
      # 2:      B        2      10
      # 3:      B        3      10
      # 4:      B        1      10
      # 5:      B        2      10
      # 6:      B        3      10
      # 7:      A        1       1
      # 8:      A        2       1
      # 9:      A        3       1
      

      如果您正在引导(我怀疑您是)并计划重复多次,那么首先分配随机化块会更有效:

      RB <- DATA[ , unique(SAMPLE)]
      #repeat BB times
      replicate(BB, DATA[.(sample(RB, rep = TRUE))])
      

      【讨论】:

      • 谢谢迈克尔!但是,在阅读了回复后,我意识到我最初的问题并没有反映我的问题的复杂性。欢迎任何对更新问题的解决方案。保重。
      • @Vesuccio 不是RB &lt;- DATA[ , unique(SAMPLE)],而是RB &lt;- unique(DATA[ , .(SITE, DATE)]),而不是DATE[.(sample(...)),而是DATA[RB[sample(.N, rep = TRUE)], ..., on = c("SITE", "DATE")]...我不是100%肯定这会奏效,但我不会'不喜欢你翻转了问题并取消了我的答案。
      • 对不起那个迈克尔。我没有在想。我应该发布一个新问题。谢谢你的时间。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 2015-06-14
      • 1970-01-01
      相关资源
      最近更新 更多