3

我有一个小标题,df有一个因素A,我希望:

1) 的副本C, 和
2) 基于第二个变量B.

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

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

我该怎么做?

4

2 回答 2

5

使用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
于 2017-10-24T12:54:46.717 回答
1

转换发生在ifelse. 从文档:

价值

长度和属性(包括维度 和 "class")与来自或test的值的数据值相同的向量。答案的模式将从逻辑强制转换,以首先容纳取自的任何值,然后容纳取自的任何值。yesnoyesno

因为yesis"B is NA"是一个字符向量,所以输出是一个字符向量。将 from 的值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带有警告。因子仅限于采用特定值。如果你想添加一个新的,你必须明确地这样做。

于 2017-10-24T13:50:10.023 回答