Home > Mobile >  Tidyverse change values based on name
Tidyverse change values based on name

Time:12-22

I have a dataframe as follows

library(tidyverse)
library(tidymodels)

#df <- read_csv("C:\\Users\\omarl\\OneDrive\\Escritorio\\games.csv")

df <- structure(list(gameId = 3326086514, creationTime = 1504279457970, 
                     gameDuration = 1949, seasonId = 9, winner = 1, firstBlood = 2, 
                     firstTower = 1, firstInhibitor = 1, firstBaron = 1, firstDragon = 1, 
                     firstRiftHerald = 2, t1_champ1id = 8, t1_champ1_sum1 = 12, 
                     t1_champ1_sum2 = 4, t1_champ2id = 432, t1_champ2_sum1 = 3, 
                     t1_champ2_sum2 = 4, t1_champ3id = 96, t1_champ3_sum1 = 4, 
                     t1_champ3_sum2 = 7, t1_champ4id = 11, t1_champ4_sum1 = 11, 
                     t1_champ4_sum2 = 6, t1_champ5id = 112, t1_champ5_sum1 = 4, 
                     t1_champ5_sum2 = 14, t1_towerKills = 11, t1_inhibitorKills = 1, 
                     t1_baronKills = 2, t1_dragonKills = 3, t1_riftHeraldKills = 0, 
                     t1_ban1 = 92, t1_ban2 = 40, t1_ban3 = 69, t1_ban4 = 119, 
                     t1_ban5 = 141, t2_champ1id = 104, t2_champ1_sum1 = 11, t2_champ1_sum2 = 4, 
                     t2_champ2id = 498, t2_champ2_sum1 = 4, t2_champ2_sum2 = 7, 
                     t2_champ3id = 122, t2_champ3_sum1 = 6, t2_champ3_sum2 = 4, 
                     t2_champ4id = 238, t2_champ4_sum1 = 14, t2_champ4_sum2 = 4, 
                     t2_champ5id = 412, t2_champ5_sum1 = 4, t2_champ5_sum2 = 3, 
                     t2_towerKills = 5, t2_inhibitorKills = 0, t2_baronKills = 0, 
                     t2_dragonKills = 1, t2_riftHeraldKills = 1, t2_ban1 = 114, 
                     t2_ban2 = 67, t2_ban3 = 43, t2_ban4 = 16, t2_ban5 = 51), row.names = c(NA, 
                                                                                            -1L), class = c("tbl_df", "tbl", "data.frame"))

df <- df %>%
  mutate(winner = ifelse(winner == 1, "team1", "team2")) %>%
  mutate(firstBlood = ifelse(firstBlood  == 1, "team1", "team2")) %>%
  mutate(firstTower = ifelse(firstTower == 1, "team1", "team2")) %>%
  mutate(firstInhibitor = ifelse(firstInhibitor == 1, "team1", "team2")) %>%
  mutate(firstBaron = ifelse(firstBaron == 1, "team1", "team2")) %>%
  mutate(firstDragon = ifelse(firstDragon == 1, "team1", "team2")) %>%
  mutate(firstRiftHerald = ifelse(firstRiftHerald == 1, "team1", "team2")) %>%
  select(-gameId, -creationTime) %>%
  filter(seasonId == 9) %>%
  select(gameDuration, winner, firstBlood, firstTower, firstInhibitor, firstBaron, firstDragon,
         firstRiftHerald)

As you can see, mutate is really redundant here, because I'm copying the code for every variable. Is there any way to apply the ifelse to columns that start with first, t1, etc. programatically?

CodePudding user response:

You may try

library(dplyr)

df %>%
  mutate(across(starts_with("t1")|starts_with("first"), ~ifelse(.x == 1, "team1", "team2")))

CodePudding user response:

Park gave a best (one liner) solution. But if you want to look at some other options, here is how we can do it via using some other functions in dplyr:

df %>% 
  gather(key, value, firstBlood:t1_ban5) %>% 
  mutate(value = ifelse(value == 1, "team1", "team2")) %>% 
  spread(key, value) %>% 
  select(-gameId, -creationTime) %>%
  filter(seasonId == 9) %>%
  select(gameDuration, winner, firstBlood, firstTower, firstInhibitor, firstBaron, firstDragon,
         firstRiftHerald)
  • Related