dplyr mutate_at: создавать новые переменные с перекодированием - PullRequest
1 голос
/ 21 марта 2019

Я не могу создать несколько обратных переменных с помощью dplyr.

Определение проблемы:

df <- data.frame (V1 =c (1,2,2,1,2), V2 = c(2,2,1,2,2), V3 = c(3,5,2,1,4))

Я хочу инвертировать значения 1 и 2 в первых 2 переменных.
Я перепробовал много вещей, но ничего не работает.

Я хочу получить

V1  V2  V3
2   1   3
1   1   5
1   2   2
2   1   1
1   1   4

1 Ответ

1 голос
/ 21 марта 2019

Существует множество способов атаковать это. Достаточно простого оператора case_when:

library(tidyverse)

df <- data.frame(
  V1 =c (1,2,2,1,2), 
  V2 = c(2,2,1,2,2), 
  V3 = c(3,5,2,1,4)
)
df
#>   V1 V2 V3
#> 1  1  2  3
#> 2  2  2  5
#> 3  2  1  2
#> 4  1  2  1
#> 5  2  2  4

df %>%
  mutate(
    V1 = case_when(V1 == 1 ~ 2, V1 == 2 ~ 1),
    V2 = case_when(V2 == 1 ~ 2, V2 == 2 ~ 1)
  )
#>   V1 V2 V3
#> 1  2  1  3
#> 2  1  1  5
#> 3  1  2  2
#> 4  2  1  1
#> 5  1  1  4

Но так как вы сказали mutate_at, вы, вероятно, хотите использовать функцию:

flip_ones_and_twos <- function(x) {
  return(x %% 2 + 1)
}

df %>%
  mutate_at(vars(V1, V2), ~ flip_ones_and_twos(.))
#>   V1 V2 V3
#> 1  2  1  3
#> 2  1  1  5
#> 3  1  2  2
#> 4  2  1  1
#> 5  1  1  4

Я уверен, что есть и другие подходы (например, if.else или if_else).

...