r - 从变量分组的数据框中搜索并删除异常值

标签 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      Mg         25
5 24.9835      V11 129571.9      Mg         25
6 24.9835      V12 114214.0      Mg         25

我需要执行以下操作:
  • 标识与中位数相差大于2个标准偏差的所有值(来自“value”变量),并按元素变量分组。
  • 从数据框中删除异常值(或创建一个排除了异常值的新数据框。

  • 我一直在使用dplyr软件包,并使用以下代码对“元素”变量进行分组,并提供平均值:
    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), ]
    

    最佳答案

    这是使用基数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))])
    })
    

    并使用dplyr
    df1 = df %>%
      group_by(element) %>%
      filter(!(abs(value - median(value)) > 2*sd(value))) %>%
      summarise_each(funs(mean), value)
    

    结果比较:
    > 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
    

    关于r - 从变量分组的数据框中搜索并删除异常值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28687515/

    相关文章:

    r - 列表中每个数据帧的最长更改运行时间

    r - 删除数据框行的简单方法对于没有行匹配删除条件的实例很健壮

    SQL检查取消分组列值是否匹配

    mysql - 如何按用户每台设备选择最后一条消息

    python - 循环并通过多索引的子集选择行

    python - 将数字转换为 pandas DataFrame 中的特定字符串格式

    r - 在 Rmarkdown 中插入带有图像的标题页以呈现 pdf 文档

    r - 从命令行Linux执行R脚本时忽略错误并继续运行

    json - 在 R 中创建具有多个子项的 Json 对象

    c# - Linq to Entities 4.1 - 组查询强制排序