在组内使用 ntile

using ntile within a group

我正在尝试计算每组数据帧中的五分位数。如果我这样做:

mtcars %>%
  group_by(gear,carb) %>%
  summarise(total = sum(wt), .groups = "keep") %>%
  mutate(rank = ntile(total,5))

rank 列中的所有条目都等于 1。我在这里做错了什么?

因为当您 group_by(gear, carb) 时,这两个变量的唯一组合被视为一个组。由于您使用了 summrise(..., .groups = "keep"),输入中的所有分组变量都将被保留。在这种情况下,这两列只有一个唯一的组合,因此,每一行都在它自己的组中(注意 tibble 输出中的 # Groups: gear, carb [11])。所以,你每组计算一个元素ntile,结果当然是1.

如果你不包含.groups = "keep"参数,最后一个分组变量将被丢弃(carb将被丢弃),你可以看到每个gear的排名(注意# Groups: gear [3]).

documentation(?dplyr::summarise)中的更多信息:

When .groups is not specified, it is chosen based on the number of rows of the results:

  • If all the results have 1 row, you get "drop_last".
  • If the number of rows varies, you get "keep".
library(dplyr)

mtcars %>%
  group_by(gear,carb) %>%
  summarise(total = sum(wt)) %>%
  mutate(rank = ntile(total, 5))

# A tibble: 11 × 4
# Groups:   gear [3]
    gear  carb total  rank
   <dbl> <dbl> <dbl> <int>
 1     3     1  9.14     1
 2     3     2 14.2      3
 3     3     3 11.6      2
 4     3     4 23.4      4
 5     4     1  8.29     1
 6     4     2 10.7      2
 7     4     4 12.4      3
 8     5     2  3.65     4
 9     5     4  3.17     2
10     5     6  2.77     1
11     5     8  3.57     3