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