dplyr mutate_at:使用重新编码创建新变量

时间:2019-03-21 13:38:52

标签: r dplyr recode

我无法使用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的值。
我已经尝试了很多东西,但是没有用。

我想获得

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

1 个答案:

答案 0 :(得分:1)

有多种方法可以对此进行攻击。一个简单的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.elseif_else)。