【问题标题】:Conditional recoding of factor to factor因子到因子的条件重新编码
【发布时间】:2018-04-05 06:30:50
【问题描述】:

我有一个 tibble,df,有一个因素,A,我希望:

1) C
的副本 2) 基于第二个变量 B 重新编码。

目前我正在以这种迂回的方式进行。我对因子的条件重新编码感到非常困惑。我也看了dplyr's recode,但找不到更聪明的方法。

library(tibble)
df  <- tibble(
  A = factor(c(NA, "b", "c")), 
  B = c(1,NA,3)
)

我最初的小标题

df
#> # A tibble: 3 x 2
#>        A     B
#>   <fctr> <dbl>
#> 1   <NA>     1
#> 2      b    NA
#> 3      c     3

我当前解决方案中的第 1 步

df$C <- with(df, ifelse(is.na(B), 'B is NA', A)) 
df
#> # A tibble: 3 x 3
#>        A     B       C
#>   <fctr> <dbl>   <chr>
#> 1   <NA>     1    <NA>
#> 2      b    NA B is NA
#> 3      c     3       2

我当前解决方案中的第 2 步

df$C <- dplyr::recode_factor(df$C, '2' = 'c')
df
#> # A tibble: 3 x 3
#>        A     B       C
#>   <fctr> <dbl>  <fctr>
#> 1   <NA>     1    <NA>
#> 2      b    NA B is NA
#> 3      c     3       c

我应该怎么做?

【问题讨论】:

    标签: r tidyverse recode tibble


    【解决方案1】:

    使用dplyr::if_else,将因子转换为字符,然后再次转换为因子:

    library(dplyr)
    
    df %>% 
      mutate(C = factor(if_else(is.na(B), "B is NA", as.character(A))))
    
    # # A tibble: 3 x 3
    #          A     B       C
    #     <fctr> <dbl>  <fctr>
    #   1   <NA>     1    <NA>
    #   2      b    NA B is NA
    #   3      c     3       c
    

    【讨论】:

    • 谢谢。它回答了我的问题,但我仍然对我似乎先走一步然后返回的情况感到惊讶,即将因子转换为字符,然后再次转换为因子
    • @EricFail 如果我们不需要说“B is NA”,我们可以这样做:df$C &lt;- df$A; df$C &lt;- ifelse(is.na(df$B), NA, df$C)
    【解决方案2】:

    转换发生在ifelse。来自文档:

    价值

    具有相同长度和属性的向量(包括维度和 "class") 作为test 和来自yesno 的值的数据值。这 答案的模式将被强制从逻辑到首先适应 取自 yes 的任何值,然后取自 no 的任何值。

    因为yes"B is NA",是一个字符向量,所以输出是一个字符向量。 A 中的值被转换为整数然后转换为字符是一个奇怪的实现结果。因子实际上是具有修改的classlevels 属性的整数向量。

    您也可以通过复制 A,将 "B is NA" 添加到可接受的级别,然后替换子集来实现此目的。

    df$C <- df$A
    levels(df$C) <- c(levels(df$C), "B is NA")
    df$C[is.na(df$B)] <- "B is NA"
    df
    # # A tibble: 3 x 3
    #        A     B       C
    #   <fctr> <dbl>  <fctr>
    # 1   <NA>     1    <NA>
    # 2      b    NA B is NA
    # 3      c     3       c
    

    请注意,如果您不将"B is NA" 添加到级别,则所有替换的值都将是NA 并带有警告。因子仅限于采用特定值。如果你想添加一个新的,你必须明确地这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-08
      • 1970-01-01
      相关资源
      最近更新 更多