使用带过滤器的dplyr,group_by和tail?

bee*_*oot 12 r dplyr

这是df的一个例子:

df <- structure(list(x = 1:30, y = 101:130, g = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), .Label = c("A", "B", "C"), class = "factor")), .Names = c("x", "y", "g"), row.names = c(NA, -30L), class = "data.frame")
Run Code Online (Sandbox Code Playgroud)

我想在过滤后的数据中获得每组10个最低y值.

df2 <- df %>% filter(x>3) %>% group_by(g) %>%  tail(y, n=10)
Run Code Online (Sandbox Code Playgroud)

仅返回最后一组的行(在本例中为C):

Source: local data frame [10 x 3]
Groups: g

    x   y g
18 21 121 C
19 22 122 C
20 23 123 C
21 24 124 C
22 25 125 C
23 26 126 C
24 27 127 C
25 28 128 C
26 29 129 C
27 30 130 C
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

aos*_*ith 18

你可以tail在里面使用do.

df2 <- df %>% filter(x>3) %>% group_by(g) %>%  do(tail(., n=10))
Run Code Online (Sandbox Code Playgroud)

使用.是实现这一目标的关键.在do帮助页面中:"您可以使用.来引用当前组."

编辑:

正如@beginneR指出的那样,我专注于如何tail在小组中使用dplyr并错过了OP要求10个最低值的问题的部分y.要正确地执行此操作将需要添加arrange.有了tail,这意味着按降序排列y.

df2 <- df %>% filter(x>3) %>% group_by(g) %>%  arrange(desc(y)) %>% do(tail(., n=10))
Run Code Online (Sandbox Code Playgroud)


tal*_*lat 6

这是另外两个选项:

df %>% filter(x>3) %>% group_by(g) %>% top_n(3, desc(y))
Run Code Online (Sandbox Code Playgroud)

这里我们使用top_n但使用,desc(y)因为我们想要最低 y值而不是最大(“最高”)y值。

df %>% filter(x>3) %>% group_by(g) %>% arrange(y) %>% filter(1:n() <= 10)
Run Code Online (Sandbox Code Playgroud)

这等于

df %>% filter(x>3) %>% group_by(g) %>% arrange(y) %>% slice(1:10)
Run Code Online (Sandbox Code Playgroud)

分组后,我们通过增加对每个组进行排序y,然后选择每组的前 10 行(如果组中没有 10 行,则选择更少)。

由于要选择的最低值和最后一个值存在一些混淆:此答案选择最低值,而不是最后一个条目。