因子的有条件重新编码因子

时间:2017-10-24 12:39:42

标签: r tidyverse recode tibble

我有一个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

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

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

我怎么想这样做?

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

转换发生在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,并显示警告。因素仅限于采用特定值。如果你想添加一个新的,你必须明确地这样做。