Изменение нескольких переменных с помощью условного оператора - PullRequest
0 голосов
/ 03 июня 2019

У меня есть несколько переменных, которые я хотел бы изменить с помощью оператора if else. Вот код, который я использую для выполнения работы:

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)))

Однако, есть ли более компактный способ сделать эти множественные изменения, используя тидиверс?

1 Ответ

1 голос
/ 03 июня 2019

Вместо применения функции к каждому столбцу в отдельности, где вам нужно вводить имена столбцов каждый раз, когда вы можете использовать apply (..), чтобы сделать это для вас.

Некоторые данные:

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)

Ваша функция и предложенная функция дают одинаковые результаты

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...