gpt4 book ai didi

r - 如何让这段R代码更优雅?

转载 作者:行者123 更新时间:2023-12-02 05:36:20 24 4
gpt4 key购买 nike

我正在解决一个 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

关于r - 如何让这段R代码更优雅?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41210215/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com