#r #if-statement #rank #dplyr
#r #if-оператор #ранг #dplyr
Вопрос:
Я хочу скопировать фрейм данных india04 и добавить новую переменную с именем «incwage_adj», используя mutate(), где все значения дохода между 1-м и 99-м процентилями заменяются пропущенными значениями (NA). Упаковка:
library(tidyverse)
require(nycflights13)
data(diamonds)
load("india04.Rdata")
Код:
india04_new <- india04 %>%
mutate(incwage_adj = ifelse(incwage != quantile(india04_new2$incwage, 0.99), NA, incwage))
Комментарии:
1. Вы можете использовать
ifelse(between(incwage, quantile(india04_new2$incwage, 0.99), incwage, NA)
2. india04_new2 <- india04 %>% мутировать(incwage_adj = ifelse(между(incwage, квантиль(india04_new2 $incwage, 0.99), incwage, NA))) Возвращает: «Ошибка между (incwage, квантиль(india04_new2 $incwage, 0.99), incwage, : неиспользуемый аргумент (NA)»
3. Я думаю, что вам
quantile
нужно иметь дваprobs
, т.е.ifelse(between(incwage, quantile(incwage, 0.01), quantile(incwage, 0.99)), incwage, NA))
4. Теперь возвращает: ошибка в квантиле. по умолчанию (incwage, 0.01): пропущенные значения и значения NaN не допускаются, если ‘na.rm’ имеет значение FALSE
5. вы используете
diamonds
или другие данные
Ответ №1:
Мы можем использовать between
для создания логического условия и изменения значений, которые не находятся между 1 и 99%, на NA
library(dplyr)
mtcars %>%
mutate(mpg_adj = ifelse(between(mpg,
quantile(mpg, 0.01, na.rm = TRUE),
quantile(mpg, 0.99, na.rm = TRUE)), mpg, NA))
Или с case_when
mtcars %>%
mutate(mpg_adj = case_when(between(mpg,
quantile(mpg, 0.01, na.rm = TRUE),
quantile(mpg, 0.99, na.rm = TRUE))~ mpg))
Ответ №2:
Попробуйте выполнить следующее :
india04_new2$incwage[with(india04_new2,
incwage > quantile(incwage, 0.01) amp; incwage < quantile(incwage, 0.99))] <- NA
Это должно заменить все incwage
значения, которые находятся между 1-м и 99-м процентилями.