使用R中的tidyverse重新编码多个变量

时间:2017-10-04 18:42:49

标签: r dplyr tidyverse recode

可能是一个愚蠢的问题,我想在多个条件的tibble中重新编码多个变量。

数据示例:

library(tidyverse)
s <- matrix(sample(1:15, 20, replace = TRUE), ncol = 4)
s <- as_tibble(s)

其中包含以下内容:

# A tibble: 5 x 4
     V1    V2    V3    V4
  <int> <int> <int> <int>
1    11     2     5    14
2     5     4    15     5
3    13    15     2     5
4     7    13    15    11
5    11     5    12     3

我想用这个条件重新编码V1,V2,V3,并保持V4相等: 如果该值小于或等于5得1,如果该值大于5但小于或等于10得2,最后如果该值大于10得到3。

输出应如下所示:

# A tibble: 5 x 4
         V1    V2    V3    V4
      <int> <int> <int> <int>
    1    3     1     1     14
    2    1     1     3      5
    3    3     3     1      5
    4    2     3     3     11 
    5    3     1     3      3

我知道应用,sapply,vapply,但我想使用tidyverse包中的函数并以优雅的方式重新编码。

提前致谢!

1 个答案:

答案 0 :(得分:6)

要详细说明@MrFlick注释,您可以将mutate_at与dplyr中的case_when函数结合使用。它看起来像这样:

s %>% 
  mutate_at(vars(V1:V3), 
            function(x) case_when(x <= 5 ~ 1, x <= 10 ~ 2, TRUE ~ 3))

这会给你:

# A tibble: 5 x 4
     V1    V2    V3    V4
  <dbl> <dbl> <dbl> <int>
1     3     1     3     6
2     2     1     1     8
3     2     3     1    14
4     1     3     3    15
5     1     2     3     7