【问题标题】:Can I subsample different sizes per group with dplyr?我可以使用 dplyr 对每组不同的大小进行二次抽样吗?
【发布时间】:2016-10-14 13:58:54
【问题描述】:

好的,我知道我可以做这样的事情,

mtcars %>% 
group_by(cyl) %>% 
sample_n(2)

这会给我,

Source: local data frame [6 x 11]
Groups: cyl [3]

 mpg   cyl  disp    hp  drat    wt  qsec    vs    am
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1  21.4     4 121.0   109  4.11 2.780 18.60     1     1
2  33.9     4  71.1    65  4.22 1.835 19.90     1     1
3  18.1     6 225.0   105  2.76 3.460 20.22     1     0
4  21.0     6 160.0   110  3.90 2.875 17.02     0     1
5  15.2     8 304.0   150  3.15 3.435 17.30     0     0
6  10.4     8 460.0   215  3.00 5.424 17.82     0     0
# ... with 2 more variables: gear <dbl>, carb <dbl>

所以每个气缸 2 个样本。这看起来很酷。但是,有一种方法可以设置与分组特征的唯一元素匹配的大小向量,这样对于 4 缸的汽车,我可以得到 n = 1,对于 6 缸的汽车,我可以得到 n = 10 等等?

谢谢!

【问题讨论】:

  • 您要带或不带替换的样品吗?

标签: r dplyr


【解决方案1】:

这是在一个块中完成的:

require(dplyr)
require(tidyr)
require(purrr)

sample_scheme <- data_frame(cyl = c(4,6,8),
                            n = c(1,5,3))

mtcars %>% 
  nest(-cyl) %>% 
  left_join(sample_scheme, by = "cyl") %>%
  mutate(Sample = map2(data, n, sample_n)) %>% 
  unnest(Sample)

【讨论】:

  • 非常好,但这假设样本大小为cyl。更通用的解决方案是在嵌套 step 之后加入包含按 cyl 组的样本大小的 data.frame。
  • 实现了这个
【解决方案2】:

分别做每个,然后将它们绑定在一起。我假设你已经在 dplyr:

bind_rows(
  mtcars %>% 
    group_by(cyl) %>%
    filter(cyl==4) %>%
    sample_n(1),
  mtcars %>% 
    group_by(cyl) %>%
    filter(cyl==6) %>%
    sample_n(6))

我们不能做 10 行 cyl==6 因为只有 6 ;)

【讨论】:

  • 真的!我的错哈哈
  • 没问题@DavidMas!仅供参考,这两个 cmets 在 Stack Overflow 上是不鼓励的(它们会促进膨胀并且不添加任何内容)。您的 +1 和接受的答案非常感谢!
猜你喜欢
  • 1970-01-01
  • 2022-01-13
  • 1970-01-01
  • 2015-07-31
  • 2012-06-30
  • 2016-01-10
  • 1970-01-01
  • 2021-01-19
  • 1970-01-01
相关资源
最近更新 更多