在我的数据集中,我必须分别为每个组删除异常值。 这是我的数据集
vpg=structure(list(customer = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 1L,
1L, 1L, 1L, 2L, 2L, 2L, 2L), code = c(2L, 2L, 3L, 3L, 4L, 4L,
5L, 5L, 2L, 2L, 3L, 3L, 4L, 4L, 5L, 5L), year = c(2017L, 2017L,
2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2018L, 2018L, 2018L,
2018L, 2018L, 2018L, 2018L, 2018L), stuff = c(10L, 20L, 30L,
40L, 50L, 60L, 70L, 80L, 10L, 20L, 30L, 40L, 50L, 60L, 70L, 80L
), action = c(0L, 1L, 0L, 1L, 0L, 1L, 0L, 1L, 0L, 1L, 0L, 1L,
0L, 1L, 0L, 1L)), .Names = c("customer", "code", "year", "stuff",
"action"), class = "data.frame", row.names = c(NA, -16L))
我需要从“stuff”变量中删除离群值,但是要按照客户+代码+年份分组单独进行操作。
我找到了这个非常好用的函数。
remove_outliers <- function(x, na.rm = TRUE, ...) {
qnt <- quantile(x, probs=c(.25, .75), na.rm = na.rm, ...)
H <- 1.5 * IQR(x, na.rm = na.rm)
y <- x
y[x < (qnt[1] - H)] <- NA
y[x > (qnt[2] + H)] <- NA
y
}
new <- remove_outliers(vpg$stuff)
vpg=cbind(new,vpg)
View(vpg)
但是它适用于所有群体。 如何使用此功能删除每个组的异常值并获取清晰的数据集以进行下一步操作? 请注意,在此数据集中,有一个名为“action”的变量(它取值为0和1)。它不是分组变量,但是必须仅删除“action”变量的零(0)类别的异常值。