【问题标题】:How to automate recoding of many variables using mutate_at and nested ifelse statement?如何使用 mutate_at 和嵌套 ifelse 语句自动重新编码许多变量?
【发布时间】:2020-05-31 22:38:19
【问题描述】:

有一个大型数据集,由对每个受试者的相同变量的重复测量组成。示例数据如下

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。因为它涉及许多变量,我正在使用“mutate_at”来自动重新编码。此外,采用相同代码的数字不是连续的(例如 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   

【问题讨论】:

    标签: r dataframe dplyr recode


    【解决方案1】:

    使用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】:

      我们可以使用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】:

        这是另一个类似于您尝试的解决方案。我刚刚添加了“或”运算符 (|) 以简化 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))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-08-03
          • 2019-08-12
          • 2019-10-23
          • 2019-12-03
          • 1970-01-01
          相关资源
          最近更新 更多