R 从按变量分组的数据帧中搜索并删除异常值

R 从按变量分组的数据帧中搜索并删除异常值,r,group-by,dataframe,dplyr,outliers,R,Group By,Dataframe,Dplyr,Outliers,我有一个数据框,有5个变量和800行: head(df) V1 variable value element OtolithNum 1 24.9835 V7 130230.0 Mg 25 2 24.9835 V8 145844.0 Mg 25 3 24.9835 V9 126126.0 Mg 25 4 24.9835 V10 103152.0

我有一个数据框,有5个变量和800行:

head(df)
       V1 variable    value element OtolithNum
1 24.9835       V7 130230.0      Mg         25
2 24.9835       V8 145844.0      Mg         25
3 24.9835       V9 126126.0      Mg         25
4 24.9835      V10 103152.0      Mg         25
5 24.9835      V11 129571.9      Mg         25
6 24.9835      V12 114214.0      Mg         25
我需要执行以下操作:

  • 识别所有值(来自“值”变量),这些值与中位数的标准偏差>2,按元素变量分组
  • 从数据帧中删除离群值(或创建一个排除离群值的新数据帧)
  • 我一直在使用dplyr包,并使用以下代码按“element”变量分组,并提供平均值:

    df1=df %>%
      group_by(element) %>%
      summarise_each(funs(mean), value)
    
    在我提取平均值之前,请您帮助我操作或添加上述代码,以删除由“element”变量分组的异常值(定义见上文,中位数大于2 sd)

    我从另一个帖子中尝试了以下代码(这就是为什么上面的数据名与我的个人数据不匹配),但运气不佳:

    #standardize each column (we use it in the outdet function)
       scale(dat)
    #create function that looks for values > +/- 2 sd from mean
       outdet <- function(x) abs(scale(x)) >= 2
    #index with the function to remove those values
       dat[!apply(sapply(dat, outdet), 1, any), ]
    
    #标准化每个列(我们在outdet函数中使用它)
    刻度(dat)
    #创建从平均值中查找值>+/-2 sd的函数
    outdet=2
    #使用函数索引以删除这些值
    数据[!应用(sapply(数据,输出),1,任何),]
    
    这里有一个使用base R的方法:

    element <- sample(letters[1:5], 1e4, replace=T)
    value <- rnorm(1e4)
    df <- data.frame(element, value)
    
    means.without.ols <- tapply(value, element, function(x) {
      mean(x[!(abs(x - median(x)) > 2*sd(x))])
    })
    
    结果比较:

    > means.without.ols
               a            b            c            d            e 
    -0.008059215 -0.035448381 -0.013836321 -0.013537466  0.021170663 
    
    > df1
    Source: local data frame [5 x 2]
    
      element        value
    1       a -0.008059215
    2       b -0.035448381
    3       c -0.013836321
    4       d -0.013537466
    5       e  0.021170663
    
    你可能需要检查一下
    > means.without.ols
               a            b            c            d            e 
    -0.008059215 -0.035448381 -0.013836321 -0.013537466  0.021170663 
    
    > df1
    Source: local data frame [5 x 2]
    
      element        value
    1       a -0.008059215
    2       b -0.035448381
    3       c -0.013836321
    4       d -0.013537466
    5       e  0.021170663