我正在解决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)
将条件应用于每一行的事情?虽然按行,但我不知道数据属于哪一列。
我们创建numeric
列的逻辑索引('numeric.vars'),遍历数据集的这些列,使用median
和来应用条件mad
,并检查所有变量是否都符合每一行的条件(使用Reduce
和&
)来创建逻辑vector
('i1'),我们曾用它来对“钻石”数据集的行进行子集化。
numeric.vars <- sapply(diamonds, is.numeric)
i1 <- Reduce(`&`, lapply(diamonds[numeric.vars], function(v)
(v > median(v) - 3* mad(v)) & (v < median(v) + 3 * mad(v))) )
SubDiam <- diamonds[i1,]
nrow(SubDiam)
#[1] 44736
根据OP的代码
nrow(clean)
#[1] 44736
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句