【问题标题】:How to remove 99th percentile outliers in R如何删除 R 中的第 99 个百分位异常值
【发布时间】:2021-01-12 00:54:56
【问题描述】:

我只是想将每个组的异常值(那些高于 99 个百分位的值)替换为 NA。如果不创建一个全新的冗余数据框,我不知道该怎么做。有什么想法吗?

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)
}

谢谢,

【问题讨论】:

    标签: r


    【解决方案1】:

    使用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】:

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

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

      【讨论】:

        【解决方案3】:

        使用 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))
        

        【讨论】:

          猜你喜欢
          • 2012-10-31
          • 1970-01-01
          • 2019-12-26
          • 2020-01-04
          • 2016-06-20
          • 2019-04-11
          • 2012-08-11
          • 1970-01-01
          • 2018-09-05
          相关资源
          最近更新 更多