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

如何使用mutate-at和嵌套的ifelse语句自动重新编码许多变量?

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

    有一个很大的数据集,由每个主题上相同变量的重复测量组成。示例数据如下

    df<-data.frame(
    "id"=c(1:5),
    "ax1"=c(1,6,8,15,17),
    "bx1"=c(2,16,8,15,17))
    

    其中“x1”是重复测量的,所以我们可以有“ax1”、“bx1”、“cx1”等等。我试图重新编码这些变量。计划将1和3到12(包括)范围内的任何数字重新编码为0,并将2或大于或等于13的任何值重新编码为1。因为它涉及到许多变量,我正在使用“变异”来自动重新编码。而且,同一代码的数字不是连续的(例如,1和3-12将被重新编码为0),所以我使用了一个嵌套的“ifelse”语句。我试了一下

    df1<-df %>% 
    mutate_at(vars(ends_with("x1")),factor, 
            ifelse(x1>=3 & x1 <=12,0,ifelse(x1==1, 0,
                   ifelse(x1==2, 1,0))))
    

    然而,这不能工作,因为R不能识别“x1”。在此方面的任何帮助,我们都会事先表示感谢。预期的产出看起来像

    > df1
       id ax1 bx1
    1  1   0   1
    2  2   0   1
    3  3   0   0
    4  4   1   1
    5  5   1   1   
    
    3 回复  |  直到 5 年前
        1
  •  3
  •   NelsonGon phoxis    5 年前

    使用 ifelse ,我们可以执行以下操作:

    df %>% 
       mutate_at(vars(ends_with("x1")),~ifelse(. ==1 | . %in% 3:12,0,
                                               ifelse(. ==2 | .>=13,1,.)))
      id ax1 bx1
    1  1   0   1
    2  2   0   1
    3  3   0   0
    4  4   1   1
    5  5   1   1
    
        2
  •  4
  •   Ronak Shah    5 年前

    我们可以利用 case_when

    library(dplyr)
    
    df %>% 
      mutate_at(vars(ends_with("x1")), ~case_when((. >= 3 & . <= 12) | . == 1 ~ 0,
                                                   . >= 13 | . == 2 ~ 1))
    
    #  id ax1 bx1
    #1  1   0   1
    #2  2   0   1
    #3  3   0   0
    #4  4   1   1
    #5  5   1   1
    
        3
  •  1
  •   Jonathan V. Solórzano    5 年前

    这是另一个类似于你所尝试的解决方案。我刚加了“或”运算符( | ifelse 并移除 factor 从你的代码中分离出来。

    library(dplyr)
    df1<-df %>% 
      mutate_at(vars(ends_with("x1")), function(x)
                ifelse(x >= 3 & x <= 12 | x == 1,0,
                       ifelse(x >= 13 | x == 2, 1,0)))
    
    #  id ax1 bx1
    #1  1   0   1
    #2  2   0   1
    #3  3   0   0
    #4  4   1   1
    #5  5   1   1
    

    如果除了你提到的那些条件之外没有其他可能的条件(例如,有零),我认为你可以简化它,只需将它减少到以下几点:

    df1<-df %>% 
      mutate_at(vars(ends_with("x1")), function(x)
                ifelse(x >= 3 & x <= 12 | x == 1, 0, 1))