如何删除R中的第99个百分点离群值

时间:2020-09-25 16:53:17

标签: 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)
}

谢谢

3 个答案:

答案 0 :(得分:4)

使用dplyr的另一种方法

library(dplyr)
df %>% 
  group_by(group) %>% 
  mutate(var1 = ifelse(var1 > quantile(var1, .99), NA, var1))

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

df %>% 
  group_by(group) %>% 
  filter(var1 <= quantile(var1, .99))

答案 1 :(得分:0)

使用ave

df$var1[with(df, !!ave(var1, group, FUN=function(x) x > quantile(x, .99)))] <- NA
df
#    group var1
# 1      A    1
# 2      A    2
# 3      A    3
# 4      A    4
# 5      A    5
# 6      A    6
# 7      A    7
# 8      A    8
# 9      A    9
# 10     A   NA
# 11     B    1
# 12     B    2
# 13     B    3
# 14     B    4
# 15     B    5
# 16     B    6
# 17     B    7
# 18     B    8
# 19     B    9
# 20     B   NA

答案 2 :(得分:0)

您还可以使用replace()quantile()创建索引:

df$var1 = replace(df$var1, df$var1 >= quantile(df$var1, .99), NA)