【发布时间】:2016-12-18 16:04:58
【问题描述】:
我正在解决 R 练习,但我认为我可以更优雅或更简单地编写此代码。我正在使用来自 ggplot2 的钻石数据集。我必须从数值变量中删除异常值,对我来说,异常值是任何数值变量高于或低于中位数 +/- 3 倍 MAD(中位数绝对偏差)的行。我的实际代码非常手动:
library(dplyr)
filter(numeric.vars,
carat > median(carat) - 3 * mad(carat),
carat < median(carat) + 3 * mad(carat),
depth > median(depth) - 3 * mad(depth),
depth < median(depth) + 3 * mad(depth),
table > median(table) - 3 * mad(table),
table < median(table) + 3 * mad(table),
price > median(price) -3 * mad(price),
price < median(price) +3 * mad(price),
x > median(x) - 3 * mad(x),
x < median(x) + 3 * mad(x),
y > median(y) - 3 * mad(y),
y < median(y) + 3 * mad(y),
z > median(z) - 3 * mad(z),
z < median(z) + 3 * mad(z)) -> clean
我应该像apply(numeric.vars,1, myCustomFunction) 这样对每一行应用条件吗?虽然按行,但我不知道数据属于哪一列。
【问题讨论】:
-
只要你使用
function(x) abs((x - median(x)) / mad(x)) < 3而不是两个单独的逻辑检查,所有三个答案的速度大致相同