【发布时间】:2014-05-03 08:29:44
【问题描述】:
我正在使用R 的stats 包中的mad 函数来识别异常值。使用aggregate,我可以找到每个独特的因子水平组合的边界值,如下所示:
require(stats)
set.seed(492)
y <- rnorm(2000)
x1 <- sample(letters[1:2], 2000,T)
x2 <- sample(letters[1:2], 2000,T)
df <- data.frame(y,x1,x2)
boundaries <- aggregate(df$y, list(df$x1, df$x2), function(x) cbind(median(x)
+ (3*mad(x)), median(x) - (3*mad(x))))
这给出了:
+---------------------------------------+
| Group.1 Group.2 x.1 x.2 |
+---------------------------------------+
| 1 a a 2.875560 -2.809068 |
| 2 b a 2.867109 -2.843691 |
| 3 a b 3.137889 -2.960135 |
| 4 b b 3.091169 -3.134296 |
+---------------------------------------+
x.1 是上限,x.2 是下限。我想对df 进行子集化,以便为每个因子水平组合删除异常值 - 例如在 aa 中,我不希望任何高于 2.88 或低于 -2.80 的值,但对于 ab,我希望上限为3.14 和下限为 -2.96。
到目前为止,我已经尝试使用by,但它返回的数据帧长度为 0 行:
by(df$y, list(df$x1, df$x2), function(x) df[which(df$y>(median(x) + (3*mad(x))) & df$y<(median(x) - (3*mad(x)))),])
非常感谢任何指导。
【问题讨论】:
-
“x.2”是否也代表下限?
-
是的,对不起!我会在问题中澄清。