-2

I have a number of variables that I would like to change with an if else statement. Here's the code that I'm using that gets the job done:

df <- df %>%
  mutate(p = ifelse(gender == 0, p, ifelse(gender==1, 100 - p,NA)),
         t = ifelse(gender == 0, t, ifelse(gender==1, 100 - t,NA)),
         c = ifelse(gender == 0, c, ifelse(gender==1, 100 - c,NA)),
         s = ifelse(gender == 0, s, ifelse(gender==1, 100 - s,NA)),
         i = ifelse(gender == 0, i, ifelse(gender==1, 100 - i,NA)))

However, is there a more compact way of making these multiple changes using the tidyverse?

user2917781
  • 273
  • 2
  • 10
  • 2
    Please make your question [reproducible](https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example). – NelsonGon Jun 03 '19 at 12:09

1 Answers1

1

Instead of applying the function to every column separately where you have to type column names each time you can use apply(..) to do this for you.

Some data:

n <- 10
df <- data.frame(matrix(round(rnorm(n*5), 0), ncol= 5))
variablenames <- c("p", "t", "c", "s", "i")
names(df) <- variablenames
df$gender <- sample(0:1, n, replace= TRUE)

Your function and the suggeted function give the same results

df1 <- df %>%
  mutate(p = ifelse(gender == 0, p, ifelse(gender==1, 100 - p,NA)),
         t = ifelse(gender == 0, t, ifelse(gender==1, 100 - t,NA)),
         c = ifelse(gender == 0, c, ifelse(gender==1, 100 - c,NA)),
         s = ifelse(gender == 0, s, ifelse(gender==1, 100 - s,NA)),
         i = ifelse(gender == 0, i, ifelse(gender==1, 100 - i,NA)))

df2 <- apply(df[ , variablenames], 2, function(x){
  ifelse(df$gender == 0, x, ifelse(df$gender==1, 100 - x,NA))
})

df2 <- cbind.data.frame(df2, df$gender)

all(df1 == df2)
TRUE