【问题标题】:Use dplyr to convert all variables coded as "Y"/"N" to TRUE/FALSE使用 dplyr 将所有编码为“Y”/“N”的变量转换为 TRUE/FALSE
【发布时间】:2016-12-01 19:36:57
【问题描述】:

我有以下数据

df <- data.frame(A = 1:3, YN_B = c('Y', 'N', 'N'), YN_C = c('N', 'N', 'Y'))

这些在 c('Y', 'N') 中取值的变量对我来说不是很有用。将它们编码为“Y”的 TRUE 和“N”的 FALSE 会更有用。有用的是,Y/N 列的命名方式可以让我以编程方式找到它们。我认为mutate_if 在这种情况下应该是一个帮助。

我正在尝试使用 mutate_if 来实现这一点,我以前没有使用过,但它不太有效。这是我的尝试

df %>% mutate_if(matches('^YN'), .funs = funs(function(x) x == 'Y'))
Error in get(as.character(FUN), mode = "function", envir = envir) : 
  object 'p' of mode 'function' was not found

我哪里错了?

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    matches 返回指定列位置的整数,但是,mutate_if 需要布尔值作为谓词。为了使用matches,您可以改用mutate_at

    library(dplyr)
    df %>% mutate_at(vars(matches('^YN')), funs(. == 'Y'))
    #   A  YN_B  YN_C
    # 1 1  TRUE FALSE
    # 2 2 FALSE FALSE
    # 3 3 FALSE  TRUE
    

    以下是matches 工作原理的示例:

    matches('^YN', vars = c("A", "YN_B"))
    # [1] 2
    

    在此处为mutate_if添加另一种情况,我们可以根据列类型对列进行变异:

    lapply(df, class)
    # $A
    # [1] "numeric"
    
    # $YN_B
    # [1] "character"
    
    # $YN_C
    # [1] "character"
    
    df %>% mutate_if(is.character, funs(. == 'Y'))
    #   A  YN_B  YN_C
    # 1 1  TRUE FALSE
    # 2 2 FALSE FALSE
    # 3 3 FALSE  TRUE
    

    【讨论】:

      【解决方案2】:

      您不需要 plyr。使用 reshape2 包融化您的数据框并重新计算您的 value

      df.long <- within(melt(df, 'A'), value <- value == 'Y')
      

      然后放回去

      df.new <- dcast(df.long, A ~ variable)
      

      现在你明白了:

      > df.new
        A  YN_B  YN_C
      1 1  TRUE FALSE
      2 2 FALSE FALSE
      3 3 FALSE  TRUE
      

      【讨论】:

        【解决方案3】:
         >df %>% mutate(YN_B=(YN_B=="Y"),YN_C=(YN_C=="Y"))
        
                  A  YN_B  YN_C
           (int) (lgl) (lgl)
        1     1  TRUE FALSE
        2     2 FALSE FALSE
        3     3 FALSE  TRUE
        

        【讨论】:

          【解决方案4】:

          我们可以使用data.table

          library(data.table)
          i1 <- grep("YN", names(df))
          setDT(df)[, paste0(i1, "L") := lapply(.SD, `==`, "Y"), .SDcols = i1]
          

          【讨论】:

            猜你喜欢
            • 2019-08-27
            • 1970-01-01
            • 2021-06-08
            • 2019-01-14
            • 2014-01-17
            • 2020-07-06
            • 1970-01-01
            • 2012-10-29
            • 1970-01-01
            相关资源
            最近更新 更多