【问题标题】:Sample by group using the sample_n function of dplyr使用 dplyr 的 sample_n 函数按组采样
【发布时间】:2014-06-02 13:33:45
【问题描述】:

根据dplyr 帮助文件,sample_n 函数对每组采样一个固定数量。

当我运行以下代码时,我希望每个 tobgp 和 alcgp 组合有两个样本,因此总共有 32 (4*4*2) 行。但是只返回两行。

by_tobgp_alcgp <- esoph %>% group_by(tobgp,alcgp)

sample_n(by_tobgp_alcgp , 2)


# Source: local data frame [2 x 5]
# Groups: tobgp, alcgp
# 
#    agegp     alcgp tobgp ncases ncontrols
# 10 25-34    80-119 10-19      0         1
# 50 55-64 0-39g/day   30+      4         6

这是正确的吗?有没有其他方法可以使用dplyr 实现这一目标?

【问题讨论】:

  • 你使用什么版本的dplyr
  • 最新:dplyr_0.2。
  • 这似乎是open dplyr issue

标签: r dplyr


【解决方案1】:

@Henrik 描述的issueclosed

sample_n 运算符将处理 dplyr 版本 >= 0.3 的分组数据帧

library(dplyr)
data(esoph)

set.seed(123)

esoph %>%
  group_by(tobgp, alcgp) %>%
  sample_n(2)

#Source: local data frame [32 x 5]
#Groups: tobgp, alcgp [16]
#
#agegp     alcgp    tobgp ncases ncontrols
#(fctr)    (fctr)   (fctr)  (dbl)     (dbl)
#1   65-74 0-39g/day 0-9g/day      5        48
#2   25-34 0-39g/day 0-9g/day      0        40
#3   45-54     40-79 0-9g/day      6        38
#4     75+     40-79 0-9g/day      2         5
#5   55-64    80-119 0-9g/day      9        18
#6   35-44    80-119 0-9g/day      0        11
#7   45-54      120+ 0-9g/day      4         4
#8   65-74      120+ 0-9g/day      3         4
#9   45-54 0-39g/day    10-19      0        18
#10  65-74 0-39g/day    10-19      4        14
#11    75+     40-79    10-19      1         3
#12  55-64     40-79    10-19      6        21
#13  45-54    80-119    10-19      6        14
#14  25-34    80-119    10-19      0         1
#15    75+      120+    10-19      1         1
#16  35-44      120+    10-19      0         3
#17  25-34 0-39g/day    20-29      0         6
#18  55-64 0-39g/day    20-29      3        12
#19  65-74     40-79    20-29      5         9
#20  25-34     40-79    20-29      0         4
#21  55-64    80-119    20-29      3         6
#22  65-74    80-119    20-29      2         3
#23  45-54      120+    20-29      2         3
#24  35-44      120+    20-29      2         4
#25  55-64 0-39g/day      30+      4         6
#26  35-44 0-39g/day      30+      0         8
#27  35-44     40-79      30+      0         8
#28  25-34     40-79      30+      0         7
#29  35-44    80-119      30+      0         1
#30  55-64    80-119      30+      4         4
#31  25-34      120+      30+      0         2
#32  65-74      120+      30+      1         1

【讨论】:

    【解决方案2】:

    您可以使用do 运算符解决此问题:

    library(dplyr)
    data(esoph)
    
    esoph %>%
      group_by(tobgp, alcgp) %>%
      do(sample_n(., 2))
    
    #   agegp     alcgp    tobgp ncases ncontrols
    #1    75+ 0-39g/day 0-9g/day      1        18
    #2  35-44 0-39g/day 0-9g/day      0        60
    #3  55-64     40-79 0-9g/day      9        40
    #4    75+     40-79 0-9g/day      2         5
    #5  65-74    80-119 0-9g/day      6        13
    #6  55-64    80-119 0-9g/day      9        18
    #7  65-74      120+ 0-9g/day      3         4
    #8  25-34      120+ 0-9g/day      0         1
    #9  25-34 0-39g/day    10-19      0        10
    #10 35-44 0-39g/day    10-19      1        14
    #11 65-74     40-79    10-19      3        10
    #12 55-64     40-79    10-19      6        21
    #13 55-64    80-119    10-19      8        15
    #14 35-44    80-119    10-19      0         6
    #15 25-34      120+    10-19      1         1
    #16 35-44      120+    10-19      0         3
    #17 25-34 0-39g/day    20-29      0         6
    #18 35-44 0-39g/day    20-29      0         7
    #19 45-54     40-79    20-29      5        15
    #20   75+     40-79    20-29      0         3
    #21 65-74    80-119    20-29      2         3
    #22 45-54    80-119    20-29      1         5
    #23 55-64      120+    20-29      2         3
    #24 45-54      120+    20-29      2         3
    #25 25-34 0-39g/day      30+      0         5
    #26 55-64 0-39g/day      30+      4         6
    #27 25-34     40-79      30+      0         7
    #28   75+     40-79      30+      1         1
    #29 55-64    80-119      30+      4         4
    #30 35-44    80-119      30+      0         1
    #31 55-64      120+      30+      5         6
    #32 25-34      120+      30+      0         2
    

    评论后编辑:

    对于组数据,do 运算符将一个函数应用于本例中所需的每组数据(选择每组大小为 2 的样本)。因此,虽然sample_n 不适用于分组数据(不确定是否应该这样做,但我想它应该 工作),但使用do(sample_n(data,n)) 可以按需要完成工作。

    【讨论】:

    • 谢谢。你能解释一下为什么它使用do 来完成这项工作吗?
    • @JT85 我添加了一个简短的解释,虽然我不能告诉你为什么单独sampl_n 不这样做或是否应该这样做。
    猜你喜欢
    • 2019-09-04
    • 1970-01-01
    • 2015-06-14
    • 2014-02-10
    • 1970-01-01
    • 2015-04-22
    • 2021-08-28
    • 1970-01-01
    • 2017-05-30
    相关资源
    最近更新 更多