我要使用此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
答案 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))
谢谢大家。