【问题标题】:Search for and remove outliers from a dataframe grouped by a variable从按变量分组的数据框中搜索和删除异常值
【发布时间】:2015-04-25 14:05:34
【问题描述】:

我有一个包含 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

我需要执行以下操作:

  1. 识别与中位数相差 > 2 个标准差的所有值(来自“值”变量),按元素变量分组
  2. 从数据框中删除异常值(或创建一个排除异常值的新数据框。

我一直在使用 dplyr 包,并使用以下代码按“元素”变量分组,并提供平均值:

df1=df %>%
  group_by(element) %>%
  summarise_each(funs(mean), value)

在我提取均值之前,您能否帮我操作或添加到上面的代码中,以便删除由“元素”变量分组的异常值(上面定义为 >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 group-by dataframe dplyr outliers


【解决方案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))])
})

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

【讨论】:

    猜你喜欢
    • 2019-05-12
    • 2013-01-13
    • 2017-11-28
    • 2020-09-16
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 2017-10-26
    相关资源
    最近更新 更多