重新编码多个多变量

时间:2019-11-04 01:34:14

标签: r dataframe subset recode

这个问题是关于在大型数据集中重新编码多变量的。由于数据很大,并且要对许多变量进行重新编码,因此我正在寻找一种更灵活的方式来调用所有相关变量并执行重新编码。关于重新编码有很多已解决的问题(例如Recoding multiple variables in R),但这些问题不适合该问题的具体内容。下面是数据示例:

df<-data.frame("id"=c(1:5),
           "ax1"=c(2,1,4,3,4),
           "ax2"=c(7,3,6,2,2),
           "bx1"=c(3,5,7,1,2),
           "bx2"=c(1,3,1,5,2),
           "cx1"=c(1,1,7,1,6),
           "cx2"=c(3,9,5,5,4)) 

例如,我想重新编码ax1bx1cx1。在这些变量上,我想分别将1、2、3、4重新编码为0、1、1、0,否则重新编码为NA。通过使用“ dplyr”软件包,我尝试了

df <- df %>%  
 mutate_at( vars(ends_with("x1")),
         list(~ ifelse( . == 1, 0, ifelse(.== 2, 1, ifelse(.==3, 1, ifelse(.==4, 0,NA))))))

但是,这不会产生预期的输出。预期的输出看起来像

   id ax1 ax2 bx1 bx2 cx1 cx2
1  1   1   7   1   1   0   3
2  2   0   3  NA   3   0   9
3  3   0   6  NA   1  NA   5
4  4   1   2   0   5   0   5
5  5   0   2   1   2  NA   4

2 个答案:

答案 0 :(得分:3)

dplyr中,有一个recode函数专门为此

library(dplyr)
df %>%  
   mutate_at(vars(ends_with("x1")),
        ~recode(., `1` = 0, `2` = 1, `3` = 1, `4` = 0, .default = NA_real_)))

#  id ax1 ax2 bx1 bx2 cx1 cx2
#1  1   1   7   1   1   0   3
#2  2   0   3  NA   3   0   9
#3  3   0   6  NA   1  NA   5
#4  4   1   2   0   5   0   5
#5  5   0   2   1   2  NA   4

答案 1 :(得分:3)

另一种可能性:

df %>% mutate_at(vars(ends_with("x1")), 
    ~case_when(. %in% c(1,4) ~ 0,
               . %in% c(2,3) ~ 1))

(不确定为什么要在其中使用list()吗?)