Следующее работает
# Sample data based on mtcars and one additional row
df <- rbind(mtcars[, 1:3], c(100, 6, 300))
# Identify outliers
outliers <- boxplot(df$mpg, plot = FALSE)$out
#[1] 33.9 100.0
# Remove outliers
df[!(df$mpg %in% outliers), ]
Причина, по которой ваш метод дает сбой, заключается в том, что если нет outliers
, which(mtcars$mpg %in% numeric(0))
возвращает integer(0)
, и в итоге получается нулевая строка data.frame
Это именно то, что вы видите из dim
.
outliers <- boxplot(mtcars$mpg, plot = FALSE)$out
outliers
#numeric(0)
Сравнить
which(mtcars$mpg %in% outliers)
#integer(0)
с
df$mpg %in% outliers
# [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
#[13] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
#[25] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
Здесь есть хороший пост здесь, на SO, который развивает этот момент.