如何使此R代码更优雅?

david9ppo

我正在解决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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章