Как написать оператор ifelse с несколькими условиями в R? - PullRequest
0 голосов
/ 21 ноября 2018

У меня проблема с написанием оператора ifelse, у меня есть три столбца, как показано ниже:

Team 1     Winner
  T1        T1
  T2        T1
  T2        NA
  T3        NA

Я хочу другой столбец: результат такой, что если Team = Winner, то это должен быть Winner else losser и If Team= что-нибудь и победитель = нет, тогда не должно быть результата ...

Team 1     Winner   result
  T1        T1       winner
  T2        T1       losser
  T2        NA       noresult
  T3        NA       noresult

Любая помощь будет оценена.

Ответы [ 4 ]

0 голосов
/ 21 ноября 2018

Вы можете использовать dplyr::if_else(), как я изучил , это строгое, потому что он проверяет тип данных и обрабатывает NA, делая код проще:

 df %>% mutate(Result = if_else( Team==Winner, "Winner", "Loser", missing ='No result'))
  Team Winner    Result
1   T1     T1    Winner
2   T2     T1     Loser
3   T2   <NA> No result
4   T3   <NA> No result

Несмотря наЕсли посмотреть на решение с одной строкой, для вашего примера это не самое быстрое (победитель - ответ @Tim Biegeleisen, +1):

Unit: microseconds
    expr      min        lq       mean    median        uq      max neval cld
 IF_ELSE  893.013  974.5060 1176.35331 1053.2260 1343.3590 2278.398   100  b 
  IFELSE   20.481   34.3475   49.57934   47.3605   58.0275  143.361   100 a  
    CASE 1067.946 1152.4255 1423.41426 1226.0255 1721.3850 4108.795   100   c

Так что я могу выяснитькомпромисс между простотой (это, конечно, субъективно) и большим контролем (это объективно, из-за характера функций) и скоростью (если это проблема для вас, поиск ваших реальных данных, но это более объективно).

0 голосов
/ 21 ноября 2018

Другая возможность возможна с case_when из dplyr:

library(dplyr)

df %>% 
  mutate(Result = case_when(
    Team == Winner ~ "Winner",
    Team != Winner ~ "Loser",
    is.na(Winner) ~ "No result"
  ))


#   Team Winner    Result
# 1   T1     T1    Winner
# 2   T2     T1     Loser
# 3   T2   <NA> No result
# 4   T3   <NA> No result

Данные:

tt <- "Team     Winner
  T1        T1
T2        T1
T2        NA
T3        NA"

df <- read.table(text=tt, header = T, stringsAsFactors = F)
0 голосов
/ 21 ноября 2018

Использование -

df$Winner <- factor(df[,2], levels=unique(df$Team.1)) # avoid "level sets of factors are different" error
df$result <- ifelse(df$Team.1 == df$Winner, "winner", "loser")
df[is.na(df$result), "result"] <- "noresult"
df

Выход

  Team.1 Winner   result
1     T1     T1   winner
2     T2     T1    loser
3     T2   <NA> noresult
4     T3   <NA> noresult
0 голосов
/ 21 ноября 2018

Попробуйте эту логику:

df$result <- ifelse(is.na(df$Winner), "no result",
    ifelse(df$Team==df$Winner, "winner", "loser"))
df

Team Winner    result
1   T1     T1    winner
2   T2     T1     loser
3   T2   <NA> no result
4   T3   <NA> no result
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...