排除 ntile() 中的异常值

Excluding outliers in ntile()

我正在尝试为堆叠数据分配分位数组,以便对于数据的每个类别(在我的示例中为 r1 和 r2),我可以将值分为 5 组。我可以使用 ntile() 来做到这一点,如下所示。

r1<-rnorm(10,0,1)
r2<-rnorm(10,2,4)
df<-cbind(r1,r2)
df<-melt(df)

df<-df%>%group_by(Var2) %>% mutate(group=ntile(value,5)) 

但是,我希望在分组排序的时候排除掉前10%和后10%怎么办。理想情况下,我希望将这些最高值和最低值保留在输出 table 中,并且它们的组代码显示为“NA”。

感谢任何能提供帮助的人!

你的问题有点模棱两可。目前尚不清楚您是希望从五分位数计算中排除顶部和底部的 10%(这样您就得到了原始数据的第 10-90 个百分位数的相等五分位数),还是您想要首先对所有数据进行五分位数计算数据,然后排除前10%和后10%。第二种方法会给你更小的第一个和第五个五分位数,所以我假设你的意思是第一种方法:

df %>% 
  group_by(Var2) %>% 
  mutate(group = ntile(value, 10)) %>%
  mutate(group = ntile(ifelse(group %% 9 == 1, NA, value), 5))
#> # A tibble: 20 x 4
#> # Groups:   Var2 [2]
#>     Var1 Var2   value group
#>    <int> <fct>  <dbl> <int>
#>  1     1 r1    -0.626     1
#>  2     2 r1     0.184     2
#>  3     3 r1    -0.836    NA
#>  4     4 r1     1.60     NA
#>  5     5 r1     0.330     3
#>  6     6 r1    -0.820     1
#>  7     7 r1     0.487     3
#>  8     8 r1     0.738     5
#>  9     9 r1     0.576     4
#> 10    10 r1    -0.305     2
#> 11     1 r2     8.05     NA
#> 12     2 r2     3.56      2
#> 13     3 r2    -0.485     1
#> 14     4 r2    -6.86     NA
#> 15     5 r2     6.50      5
#> 16     6 r2     1.82      1
#> 17     7 r2     1.94      2
#> 18     8 r2     5.78      4
#> 19     9 r2     5.28      3
#> 20    10 r2     4.38      3

以防万一,第二种方法你可以这样实现:

df %>% 
  group_by(Var2) %>% 
  mutate(group = ntile(value, 5)) %>%
  mutate(group = ifelse(ntile(value, 10) %% 9 == 1, NA, group))
#> # A tibble: 20 x 4
#> # Groups:   Var2 [2]
#>     Var1 Var2   value group
#>    <int> <fct>  <dbl> <int>
#>  1     1 r1    -0.626     2
#>  2     2 r1     0.184     3
#>  3     3 r1    -0.836    NA
#>  4     4 r1     1.60     NA
#>  5     5 r1     0.330     3
#>  6     6 r1    -0.820     1
#>  7     7 r1     0.487     4
#>  8     8 r1     0.738     5
#>  9     9 r1     0.576     4
#> 10    10 r1    -0.305     2
#> 11     1 r2     8.05     NA
#> 12     2 r2     3.56      3
#> 13     3 r2    -0.485     1
#> 14     4 r2    -6.86     NA
#> 15     5 r2     6.50      5
#> 16     6 r2     1.82      2
#> 17     7 r2     1.94      2
#> 18     8 r2     5.78      4
#> 19     9 r2     5.28      4
#> 20    10 r2     4.38      3

reprex package (v2.0.1)

于 2022-02-19 创建

设置和使用的数据

library(dplyr)
library(reshape2)

set.seed(1)

r1 <- rnorm(10,0,1)
r2 <- rnorm(10,2,4)
df <- cbind(r1,r2)
df <- melt(df)