dplyr:使用DB-backend进行随机选择

时间:2017-03-22 14:37:59

标签: r dplyr

dplyr' s sample_n()似乎只是针对数据帧而不是单个SQL-Backend实现的。是否可以使用ORDER BY rand()来利用MySQL arrange?这与dplyr的head结合使用会更好,并且会允许类似的功能。

1 个答案:

答案 0 :(得分:1)

如果目标是在没有替换的情况下对n进行抽样,则只需sample行号和filter即可。

因此,如果我们想从mtcars中选择5个随机行,我们可以写:

filter(mtcars, row_number() %in% sample(n(), 5))

这仍然是单行,但它比普通sample_n更受限制,因为您无法通过替换来执行此操作(您无法通过过滤多次选择行)。从好的方面来说,filterrow_numbern应适用于所有来源。

请注意,如果表已分组,则将从每个组中抽取5行。如果你想要一个分数(比如每组50%),你可以写:

mtcars %>% 
  group_by(cyl) %>% 
  filter(row_number() %in% sample(n(), round(0.5 * n())))

如果您想进行加权抽样,可以直接向prob中的sample参数提供变量:

filter(mtcars, row_number() %in% sample(n(), 5, prob = disp))

此次再次采样5行,但更有可能选择disp更高的行。