Моя методология немного запутанная, поэтому потерпите меня, я объясню ниже:
library(data.table)
dt <- as.data.table(iris)[, .(Petal.Length, Sepal.Width, Species)]
dt[, sample := .I]
dt <- melt(dt, id.vars = c("Species", "sample"))
dt[, c("meanval", "sdval") := .(mean(value), sd(value)), .(Species, variable)]
dt[abs({value - meanval} / sdval) > 2, outlier := TRUE]
dt[, anyOutliers := sum(outlier, na.rm = T), sample]
dt[anyOutliers != 0, outlier := TRUE]
dt <- dcast(
dt[, .(Species, variable, value, outlier, sample)],
sample + outlier + Species ~ variable,
value.var = "value"
)
Сначала мы назначаем dt
в качестве набора данных и сохраняем только те столбцы, которые планируем построить.Затем мы назначаем фиктивный столбец, который будет важен для этого конкретного набора данных, чтобы дифференцировать строки позже.Тогда мы melt()
набор данных для целесообразности.Затем для каждого вида мы вычисляем среднее и стандартное отклонение каждого значения.Это позволяет нам в строке ниже определить выбросы (вы можете изменить > 2
здесь, чтобы повлиять на количество используемых SD).
Затем для каждого цветка мы выясним, является ли он выбросом влюбой из выбранных нами метрик (в данном случае petal.length и sepal.width).Если это так, весь цветок помечается как выброс.Затем мы возвращаем таблицу обратно в ее исходную форму, только теперь есть столбец выброса, который показывает, был ли цветок выбросом в какой-либо из наших метрик.
Я не буду вдаваться в их построение, так какВы можете выяснить, как вы хотите сделать это самостоятельно, но это должно дать общее представление о том, как двигаться дальше.Надеюсь, это поможет.