Добавление столбца с оператором if else - PullRequest
1 голос
/ 25 октября 2019

Я пытаюсь разделить числа на категории, чтобы создать новый столбец. В основном, пытаясь создать буквенную оценку («A», «B», «C», «D», «F») из баллов.

Я воспроизвел похожий фрейм данных на тот, который я 'У меня возникли проблемы в следующем коде.

df <- tibble(score = rnorm(20:100, n = 150))

Код, который я написал для добавления столбца оценок, выглядит следующим образом:

df_with_grade <- df %>% 
  mutate(Grade = if (score >= 90) {
    "A"
  } else if (score >= 80){
    "B"
  } else if (score >= 70){
    "C"
  } else if (score >= 60){
    "D"
  } else {
    "F"
  }
  )

Код выполняется с предупреждением:

Warning messages:
1: In if (score >= 90) { :
  the condition has length > 1 and only the first element will be used
2: In if (score >= 80) { :
  the condition has length > 1 and only the first element will be used
3: In if (score >= 70) { :
  the condition has length > 1 and only the first element will be used
4: In if (score >= 60) { :
  the condition has length > 1 and only the first element will be used

В результате все баллы присваиваются "F"

Ответы [ 4 ]

6 голосов
/ 25 октября 2019

Как насчет

cut(df$score,breaks=c(0,6:10)*10,labels=rev(LETTERS[c(1:4,6)]))

? rev(LETTERS[c(1:4,6)]) может быть слишком умным и не сохраняет , что много символов над c("F","D","C","B","A") ...

4 голосов
/ 25 октября 2019

, как предлагается в комментариях, вы можете использовать case_when:

df_with_grade <- df %>% 
  mutate(Grade = case_when(score >= 90 ~ "A",
                           score >= 80 ~ "B",
                           score >= 70 ~ "C",
                           score >= 60 ~ "D",
                                     TRUE ~ "F"))
3 голосов
/ 25 октября 2019

Просто чтобы показать, что вы можете использовать ifelse.

df_with_grade <- df %>% 
  mutate(Grade = 
ifelse(score>= 90, "A", 
  ifelse(score>=80, "B", 
    ifelse(score>=70, "C", 
      ifelse(score>=60, "D", 
        "F")))) 
    )
3 голосов
/ 25 октября 2019

Вы не можете использовать ifelse, он работает только с бинарными условиями. Используйте вырез, как показано ниже,

df$Grade = cut(df$score,
breaks=c(0,60,70,80,90,100),
label=c("F","D","C","B","A"),
include.lowest =TRUE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...