Длинный и прокомментированный способ сделать это, есть тысячи:
### take the Q1 - Q3 values (you could also use quantile function where you can choose methods to get quantile)
q1 <- as.numeric(summary(old_vector)[2])
q3 <- as.numeric(summary(old_vector)[5])
new_vector <- vector()
for (value in old_vector) {
if ( !is.na(value) && (value < q1 || value > q3) ) new_vector <- append(new_vector, NA)
else new_vector <- append(new_vector, value)
}
отредактировано, как вы прокомментировали:
Конечно, он может работать с такими структурами:
### your DF
df1 <- structure(list(Var1 = c(100.2, 110, 200, 456, 120000), var2 = c(NA, 4545, 45465, 44422, 250000), var3 = c(NA, 210000, 91500, 215000, 250000), var4 = c(0.983, 0.44, 0.983, 0.78, 2.23)), class = "data.frame", row.names = c(NA, -5L))
### declare the function to replace a vector outliers based on IQR boundaries
replace_outliers <- function (old_vector) {
q1 <- as.numeric(summary(old_vector)[2])
q3 <- as.numeric(summary(old_vector)[5])
new_vector <- vector()
for (value in old_vector) {
if ( !is.na(value) && (value < q1 || value > q3) ) new_vector <- append(new_vector, NA)
else new_vector <- append(new_vector, value)
}
return(new_vector)
}
### open loop on DF columns
for ( col in colnames(df1) ) {
### create new column name
name_new_col <- paste( col, "_replaced", sep = "" )
### put the replaced values in the new column
df1[,name_new_col] <- replace_outliers(df1[,col])
}
и у вас будет DF с новыми столбцами «Var [n] _replaced» с NA вместо выбросов IQR