如何在 R 中基于键使用 IQR 离群值函数

How to use IQR outlier function, based on a key, in R

我想使用这个 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 上,在每个特定键的 total 列上,基于 key 列:

    key total
US4ZNB  10
US4ZNB  1075
US4ZNB  10000
US4ZNB  1138
US4ZNB  1156
US4YYM  1114
US4YYM  1072
US4YYM  50
US4YYM  1181
US4YYM  8000
JM4YYM  15000
JM4YYM  2000
JM4YYM  100
JM4YYM  2200
JM4YYM  2300
plyr 包中的

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

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

第一个参数是 "key" 和 "total" 的数据,第二个参数是分组变量,在本例中为 "key".

最后一个变量是您要应用的函数,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 函数的输出之一相匹配。

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

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

谢谢大家