如何在R中基于键使用IQR离群值功能

时间:2018-06-27 05:08:09

标签: r function outliers iqr

我要使用此IQR功能:

    smooth_outliers <- function(x, na.rm = TRUE, ...) {
  qnt <- quantile(x, probs=c(.25, .75), na.rm = na.rm, ...)
  H <- 1.3 * IQR(x, na.rm = na.rm)
  y <- x
  y[x < (qnt[1] - H)] <- round(qnt[1] - H)
  y[x > (qnt[2] + H)] <- round(qnt[2] + H)
  y
}

在下面df的{​​{1}}列中,根据total列的每个特定键:

key

2 个答案:

答案 0 :(得分:0)

ddply包中的

plyr正是这样做的。它基于列将功能应用于数据的每个子集。

plyr::ddply(df, "key", plyr::numcolwise(smooth_outliers))

第一个参数是包含“键”和“总计”的数据,第二个参数是分组变量,在本例中为“键”。

最后一个变量是您要应用的函数,此处实际上使用了numcolwise函数,因此它将其应用于列而不是整个行。因此,我们使基于行的平滑离群值函数成为基于列的函数。

然后瞧瞧。

您将获得一个数据框,其中列出了每个键及其通过smooth_outliers函数计算出的IQR。

这是结果。

      key total
1  JM4YYM  1421
2  JM4YYM  1712
3  JM4YYM  1709
4  US4YYM  1114
5  US4YYM  1473
6  US4YYM  1181
7  US4YYM  1767
8  US4YYM  1005
9  US4ZAW  1138
10 US4ZAW  1156
11 US4ZAW  1982
12 US4ZNB  1338
13 US4ZNB  1075
14 US4ZNB  1806

如您所见,每个键都与smooth_outliers函数的输出之一匹配。

答案 1 :(得分:0)

阐述想法之后,我设法找到解决问题的方法。我刚刚使用了dplyr::group_by

df.new <- df %>% group_by(key) %>% mutate(val=smooth_outliers(total))

谢谢大家。