【问题标题】:dplyr mutate_at: create new variables with recodedplyr mutate_at:使用重新编码创建新变量
【发布时间】:2019-08-12 09:13:10
【问题描述】:

我无法使用 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))

我想反转前 2 个变量中的值 1 和 2。
我尝试了很多东西,但没有任何效果。

我要获得

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

【问题讨论】:

  • 谢谢。我正在寻找使用 mutate_at。有什么解决办法吗?
  • df %&gt;% mutate_at(vars(V1:V2), ~if_else(. == 1, 2, 1))
  • 这只是new &lt;- 3 - old吗?

标签: r dplyr recode


【解决方案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.else 或 if_else)。

【讨论】:

  • 没有太大区别,但您可以将该函数作为mutate_at(vars(V1, V2), flip_ones_and_twos) 传递,而无需公式符号
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-23
  • 1970-01-01
  • 1970-01-01
  • 2018-04-07
  • 2018-02-07
  • 1970-01-01
相关资源
最近更新 更多