我有一个类似于iris
的数据集,并且需要编写一个以以下方式处理离群值的函数:对于每个物种setosa
,versicolor
和{{1} },在每个变量virginica
,iris$Sepal.Length
,iris$Sepal.Width
和iris$Petal.Length
中,将超出1.5 * IQR的值替换为IQR +/- 1.5 * IQR的值(取决于它是高于还是低于IQR)。我一直在使用以下代码来实现此目的,但是它非常重复,耗时且容易出错。同样,以这种方式执行此操作会更改原始对象中的值。最好将参数合并到一个函数中,该函数不仅可以实现此目的,还可以告诉我更改了哪些值,并将所有输出保存到新的数据框中,而不用更改原始数据集中的值。
Petal.Width
答案 0 :(得分:3)
创建一个函数,然后按“种类”分组后将其应用于列,然后将其分配给新对象会更容易。借助dplyr
,除非我们使用magrittr
(%<>%
而非%>%
)中的特殊运算符,否则原始数据集不会即时更改
f1 <- function(x) {
qnt <- quantile(x, probs = c(.25, .75), na.rm = TRUE)
H <- 1.5*IQR(x, na.rm = TRUE)
x[x< (qnt[1] - H)] <- qnt[1]-H
x[x> (qnt[2] + H)] <- qnt[2]+H
x
}
library(dplyr)
iris1 <- iris %>%
group_by(Species) %>%
mutate_at(vars(-group_cols()), f1)
此外,如果我们仅需要应用数字列(如果数据集具有其他类型不同的列)
iris1 <- iris %>%
group_by(Species) %>%
mutate_if(is.numeric, f1)