R:保持数据框中组的值低于 99 分位数

R: Keep values below the 99 quantile for groups in data frame

我有一个包含组和值的数据框。首先,我计算每组 99% 的分位数。现在,我想为每个组删除高于 99% 分位数的值。

df<-data.frame(group = rep(c("A", "B"), each = 4),
               value = c(c(6,5,80,4,60)*10,3,5,4))

# data
  group value
1     A    60
2     A    50
3     A   800
4     A    40
5     B   600
6     B     3
7     B     5
8     B     4

计算各个组的分位数

quant<-aggregate(df$value, by = list(df$group), FUN = quantile, probs  = 0.99)

> quant
  Group.1      x
1       A 777.80
2       B 582.15

我尝试将分位数向量应用于 select 较低的值。但是,它错过了组规范..

df[df$value < quant$x,]

预期结果:

  group value
1     A    60
2     A    50
4     A    40
5     B     3
6     B     5
7     B     4

如何应用分位数向量以在数据框中按组仅保留低于 99% 的值?

分组后我们可以做一个filter

library(dplyr)
df %>%
   group_by(group) %>%
   filter(value < quantile(value, probs = 0.99))
# A tibble: 6 x 2
# Groups:   group [2]
#   group value
#  <fctr> <dbl>
#1      A    60
#2      A    50
#3      A    40
#4      B     3
#5      B     5
#6      B     4

或与 data.table

类似的语法
library(data.table)
setDT(df)[, .(value = value[value < quantile(value, probs = 0.99)]), by = group]

或使用 base R 使用 ave

df[with(df, as.logical(ave(value, group, FUN= function(x) x <quantile(x, probs = 0.99)))), ]