0

我想使用这个 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
4

2 回答 2

0

ddplyplyr包中确实做到了这一点。它基于一列对数据的每个子集应用一个函数。

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 函数的输出之一相匹配。

于 2018-06-27T05:14:14.903 回答
0

经过想法阐述,我设法为我的问题找到解决方案。我刚用过dplyr::group_by

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

谢谢大家。

于 2018-06-28T05:41:39.953 回答