我能否使用dplyr对不同组进行不同大小的子采样?

8

好的,我知道我可以这样做:

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个样本,听起来很棒。然而,有一种方法可以设置与分组特征的唯一元素匹配的大小向量,以便我可以获得n = 1(对于有4个汽缸的汽车),n = 10(对于有6个汽缸的汽车)等等?

谢谢!


你想要有替换或无替换的样本? - agenis
2个回答

11

这样可以一次性完成:

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)

2
非常好,但这假设样本大小为“cyl”。更一般的解决方案是在嵌套“step”之后加入一个包含按“cyl”组的样本大小的数据框。 - jlesuffleur
实现了这个。 - Zafar

4

分别处理每个部分,然后将它们绑定在一起。我假设您已经使用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条数据可用 ;)


真的!是我的错哈哈 - David Mas
没问题 @DavidMas!只是提醒一下,这两个评论在 Stack Overflow 上是不被鼓励的(它们会增加冗余并没有实质性的内容)。你的 +1 和采纳的答案已经足够表达感谢了! - Amit Kohli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接