如何在 R 中删除第 99 个百分位数异常值

Blu*_*lue 3 r

我只是想用 NA 分别替换每个组的异常值(高于 99% 的值)。我不知道如何在不创建一个全新的冗余数据框的情况下做到这一点。有任何想法吗 ?

group <- c('A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B')
var1 <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 50, 1, 2, 3, 4, 5, 6, 7, 8, 9, 50)
df = data.frame(group, var1)

unique_groups = unique(df$group)

df2 = data.frame()

for(g in 1:length(unique_groups)) {
  
  subset_df <- df[grep(unique_groups[1], df$group), ]

  quantiles <- quantile(subset_df$var1, c(.01, .99), na.rm = TRUE)
  
  subset_df$var1[subset_df$var1 > quantiles[2]] <- NA
  
  df2 <- rbind(df2, subset_df)
}
Run Code Online (Sandbox Code Playgroud)

谢谢你,

Jil*_*ina 5

使用 dplyr 的另一种方法

library(dplyr)
df %>% 
  group_by(group) %>% 
  mutate(var1 = ifelse(var1 > quantile(var1, .99), NA, var1))
Run Code Online (Sandbox Code Playgroud)

您还可以过滤以保持值满足条件

df %>% 
  group_by(group) %>% 
  filter(var1 <= quantile(var1, .99))
Run Code Online (Sandbox Code Playgroud)