gpt4 book ai didi

R - 从数据集中删除所有异常值

转载 作者:行者123 更新时间:2023-12-05 08:56:29 24 4
gpt4 key购买 nike

我想制作一个函数,从数据集中删除所有离群值。我已经阅读了很多关于此的 Stack Overflow 文章,所以我知道删除异常值的危险。这是我到目前为止所拥有的:

# Remove outliers from a column
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
}

# Removes all outliers from a data set
remove_all_outliers <- function(df){
# We only want the numeric columns
a<-df[,sapply(df, is.numeric)]
b<-df[,sapply(df, !is.numeric)]
a<-lapply(a,function(x) remove_outliers(x))
d<-merge(a,b)
d
}

据我所知,这有一些问题,但如果有任何可以更好地处理的地方,请指正我。

  1. !is.numeric() 不是东西,我应该怎么做?
    • 我也试过 is.numeric==FALSE
  2. is.numeric() 将因子转换为整数。我该如何防止这种情况?
  3. lapply 做对了吗?
  4. 执行 remove_outliers 函数是否有比分离数据集、执行它然后将其与非数字集合并回更好/更简单的方法?

最佳答案

因子是整数,而不是原子整数。

# Remove outliers from a column
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
}

您可以按索引替换列,这样您就不需要创建单独的数据集。只要确保将相同的数据传递给 lapply ,例如,你不想做 data[, 1:3] <- lapply(data, FUN)我已经做过很多次了。

# Removes all outliers from a data set
remove_all_outliers1 <- function(df){
# We only want the numeric columns
df[,sapply(df, is.numeric)] <- lapply(df[,sapply(df, is.numeric)], remove_outliers)
df
}

与上面类似(我认为稍微容易一些),您可以将整个数据集传递给 lapply .还要确保不要

data <- lapply(data, if (x) something else anotherthing)

data[] <- lapply(data, if (x) something)

这也是我犯过很多次的错误

remove_all_outliers2 <- function(df){
df[] <- lapply(df, function(x) if (is.numeric(x))
remove_outliers(x) else x)
df
}

## test
mt <- within(mtcars, {
mpg <- factor(mpg)
gear <- letters[1:2]
})
head(mt)

identical(remove_all_outliers1(mt), remove_all_outliers2(mt))
# [1] TRUE

您的想法可以通过一些小的调整来实现。 !is.numeric可以用作 Negate(is.numeric)或更详细的 function(x) !is.numeric(x)!sapply(x, is.numeric) .一般来说,function(function)在开箱即用的 r 中不起作用。

# Removes all outliers from a data set
remove_all_outliers <- function(df){
# We only want the numeric columns

## drop = FALSE in case only one column for either
a<-df[,sapply(df, is.numeric), drop = FALSE]
b<-df[,sapply(df, Negate(is.numeric)), drop = FALSE]

## note brackets
a[]<-lapply(a, function(x) remove_outliers(x))

## stack them back together, not merge
## you could merge if you had a unique id, one id per row
## then make sure the columns are returned in the original order
d<-cbind(a,b)
d[, names(df)]
}

identical(remove_all_outliers2(mt), remove_all_outliers(mt))
# [1] TRUE

关于R - 从数据集中删除所有异常值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40229620/

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