2017-10-04 51 views
1

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

数据例如:

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.

输出应该是lo确定这样的:

# 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包并以优雅的方式功能重新编写。

在此先感谢!

+0

看看'在dplyr mutate_at'。它旨在将相同的功能应用于多列,您可以选择,但不管您喜欢。 – MrFlick

回答

5

要详细说明@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 
+0

尽管V4专栏中存在拼写错误,但它起作用!感谢您向我介绍mutate_at函数! –

+1

错在哪里?你指的是不同的数字吗?如果是这样的话,那么只要做到这一点,'sample'在为我创建矩阵时使用了不同的数字,然后当您这样做时。 – tbradley

+1

我刚刚意识到!它工作正常! –