【发布时间】:2015-07-05 22:35:23
【问题描述】:
我有一个交易数据的数据集,如下所示:
prodid priceperitem date
62420 18.9 2014-10-09
62420 29.9 2014-09-20
62420 18.9 2014-10-11
62420 27.9 2014-07-04
62420 18.9 2014-08-25
62420 18.9 2014-11-01
我想删除每种产品的价格异常值。
我尝试了以下代码,它已将每个产品的异常值替换为 NA。但这是一个单独的列表,按 prodid 分组,我希望数据变量保留在数据框中,而不是有一个新列表。
remove.outliers <- tapply(priceperitem, prodid, function(x) {
qnt <- quantile(x, probs=c(.25, .75))
H <- 1.5 * IQR(x)
y <- x
y[x < (qnt[1] - H)] <- NA
y[x > (qnt[2] + H)] <- NA
y
})
这段代码会给我一些输出,如下所示:
$205780229
[1] NA 10.9 10.5 10.9 10.9 NA ....
这是一个新数组,但我想要的是如下:
prodid priceperitem date
205780229 NA 2014-10-03
205780229 10.9 2014-10-20
205780229 10.5 2014-10-30
205780229 10.9 2014-5-23
205780229 10.9 2014-11-20
....
【问题讨论】:
-
对不起,我没明白你的意思。我想直接删除数据框中的异常值
-
如果您删除函数中的最后四行并替换为
(x < (qnt[1] - H) | x > (qnt[2] + H)) + 0L,这将指示变量是否异常,然后您可以使用新变量 == 1 删除行如果你以后想要 -
但我的输出是一个数组,而我的原始数据集是一个数据框。我尝试了 cbind,但它不起作用。我不知道如何将这两者结合起来
-
正如我之前所说,您可以使用
ave获取 rawr 建议的 TRUE/FALSE 并使用它来删除异常值 -
我以前没用过 ave,你能不能给我看一个示例代码行来说明它是如何工作的