代码之家  ›  专栏  ›  技术社区  ›  T Richard

重编码多个多体变量

  •  1
  • T Richard  · 技术社区  · 5 年前

    这个问题是关于在一个大的数据集中重新编码多个变量。由于数据很大,需要对许多变量进行重新编码,所以我在寻找一种更灵活的方法来调用所有相关变量并执行重新编码。关于重新编码有许多已解决的问题(例如。 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)) 
    

    例如,我想重新编码 ax1 我是说, bx1 cx1 . 对于这些变量,我想分别将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 回复  |  直到 5 年前
        1
  •  3
  •   Ronak Shah    5 年前

    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
    
        2
  •  3
  •   Ben Bolker    5 年前

    另一种可能性:

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

    (不知道为什么你需要 list() 在里面?)