R Категоризация данных с использованием нескольких операторов If()

Я создал таблицу с футболистами и конкретными позициями. Теперь я хотел бы также распределить каждого игрока по общим позициям (GPosition), т.е. вратарь, защитник, полузащитник и нападающий. Извините, если они кажутся рудиментарными, но я очень плохо знаком с R

Часть моих данных ниже:

            Player      Position  GPosition
1  Thibaut Courtois       Keeper  Goalkeeper
2   Willy Caballero       Keeper  Goalkeeper
9           Eduardo       Keeper  Goalkeeper
17      Matej Delac       Keeper  Goalkeeper
19       David Luiz  Centre-Back  Goalkeeper
22  Antonio Rüdiger  Centre-Back  Goalkeeper

Я пытался использовать операторы If() или Which(), но столкнулся с несколькими проблемами. Когда я запускаю свой код, все позиции GP запускаются как GoalKeeper, а не как другие классификации. Я также не уверен, правильно ли использовать th "==" для этой цели.

Часть моего кода:

PlayerPositions$GPosition <- if(PlayerPositions$Position == "Keeper") {
  PlayerPositions$GPosition <- "Goalkeeper"
} else if (PlayerPositions$Position == "Centre-Back"){
  PlayerPositions$GPosition <- "Defender"
} else if (PlayerPositions$Position == "Left-Back"){
  PlayerPositions$GPosition <- "Defender"
} else if (PlayerPositions$Position == "Right-Back"){
  PlayerPositions$GPosition <- "Defender"

И так далее.... до последней строки:

} else if (PlayerPositions$Position == "Right Wing") {
  PlayerPositions$GPosition <- "Forward"
}

2 ответа

Решение

Использовать вложенные ifelseс вместо if а также else, Вот почему и как:

x <- c(1,2,3)
if (x==2) print("hello") else print("world")
# [1] "world"
# Warning message:
#   In if (x == 2) print("hello") else print("world") :
#   the condition has length > 1 and only the first element will be used

Условие здесь является результатом x==2, который FALSE, TRUE, FALSE, Предупреждение исчезнет, ​​если вы просто используете один элемент x:

if (x[1]==2) print("hello") else print("world")
# [1] "world"

Теперь, используя ifelse вместо этого вы получите три значения - по одному для каждого элемента x:

ifelse(x==2, "hello", "world")
# [1] "world" "hello" "world"

ifelse(x==2, "hello", ifelse(x==1, "HELLO", "world"))
# [1] "HELLO" "hello" "world"

Итак, в вашем случае:

PlayerPositions$GPosition <- 
  ifelse(PlayerPositions$Position == "Keeper", "Goalkeeper", 
    ifelse(PlayerPositions$Position %in% paste(c("Center", "Left", "Right"), "Back", sep="-"), "Defender", "Forward")) 

Я хотел бы рассмотреть возможность использования case_when от dplyr вместо нескольких операторов ifelse

Другие вопросы по тегам