#r
#r
Вопрос:
Я хотел бы знать, как заменить выбросы на «NA» в R, предполагая, что эти выбросы хранятся в векторе, созданном с помощью boxplot()$out.
Например:
# create a data frame
df <- data.frame(Group = c("Group1", "Group1", "Group2", "Group2", "Group3", "Group3", "Group4", "Group4", "Group5", "Group5"),
Value1 = c(48, 2, -130, 62, 3, 2, 8, 120, 2, 4),
Value2 = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10))
> df
Group Value1 Value2
1 Group1 48 1
2 Group1 2 2
3 Group2 -130 3
4 Group2 62 4
5 Group3 3 5
6 Group3 2 6
7 Group4 8 7
8 Group4 120 8
9 Group5 2 9
10 Group5 4 10
# plot the data frame
boxplot(df$Value1)
# create a vector of outliers for the numeric factor
outliers <- boxplot(df$Value1, plot = FALSE)$out
# view outliers
outliers
[1] -130 120
Я следовал инструкциям, перечисленным здесь, на RPubs, чтобы зайти так далеко.
Теперь я хотел бы заменить выбросы на «NA» вместо полного удаления строк, в которых они находятся, чтобы я мог хранить данные в строках, соответствующих выбросам из других столбцов, которые не являются выбросами в их соответствующих коэффициентах (т. Е. 3 и 8 в значении2). Я предполагаю, что which
и %in%
где-нибудь здесь появятся, но я застрял.
Мне нужно знать, как заменить значения на NA, чтобы позже я мог агрегировать данные из той же строки в другом столбце (а также данные из разных строк в одном столбце).
Я хотел бы заменить выбросы на NA, чтобы фрейм данных выглядел примерно так:
> df
Group Value1 Value2
1 Group1 48 1
2 Group1 2 2
3 Group2 NA 3
4 Group2 62 4
5 Group3 3 5
6 Group3 2 6
7 Group4 8 7
8 Group4 NA 8
9 Group5 2 9
10 Group5 4 10
Я относительно новичок в программировании на R.
Спасибо!
Ответ №1:
Я думаю, было бы лучше, вместо замены значений, добавить новый столбец, который указывает, являются ли эти значения выбросами (1) или нет (0).
Один из базовых R-способов сделать это:
df$is_outlier <- ifelse(df$Value1 %in% boxplot.stats(df$Value1)$out, 1, 0)
Результат:
Group Value1 Value2 is_outlier
1 Group1 48 1 0
2 Group1 2 2 0
3 Group2 -130 3 1
4 Group2 62 4 0
5 Group3 3 5 0
6 Group3 2 6 0
7 Group4 8 7 0
8 Group4 120 8 1
9 Group5 2 9 0
10 Group5 4 10 0
Комментарии:
1. Всем привет. Спасибо. Однако это не отвечает на мой вопрос. Мне нужно знать, как заменить значение на NA, чтобы позже я мог агрегировать данные по другим столбцам.
2. Зачем для этого нужна замена на NA? Возможно, отредактируйте свой вопрос, чтобы указать конечный результат, который вы хотели бы получить. Мне кажется, что изменять исходные значения для этой цели — плохая практика.
3. Как я уже указывал в своем вопросе (отредактировано), мне нужно заменить значения на NA, чтобы я мог агрегировать данные в этом столбце. Если другие рассматривают это как проблему, решением является создание нового фрейма данных при внесении этих изменений, чтобы у вас была копия одного фрейма с выбросами, а другого с удаленными выбросами.
Ответ №2:
Я полагаю, что я разобрался с этим, используя базовое решение R.
# Replace the values with NA
df[df$Value1 %in% outliers, "Value1"] = NA
Это заменяет выбросы, хранящиеся в outliers
векторе, на NA. Однако это также преобразует столбец в character
объект. Мне нужно изменить его обратно на числовой.
# no longer necessary but in case column attribute is altered
# Change column back to `numeric`
# df$Value1 <- as.numeric(df$Value1)
Вуаля. Проблема решена.
Комментарии:
1. Вы могли бы просто использовать NA без кавычек, чтобы избежать преобразования символов.
2. Блестяще! Спасибо.