我有一个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
我怎么想这样做?
答案 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
,数据值来自yes
或no
。该 答案的模式将从逻辑强制到首先适应 取自yes
的任何值,然后取自no
的任何值。
因为yes
是"B is NA"
,它是一个字符向量,所以输出是一个字符向量。将A
中的值转换为整数然后转换为字符是一个奇怪的实现结果。因素实际上是具有修改的class
和levels
属性的整数向量。
您也可以通过复制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
,并显示警告。因素仅限于采用特定值。如果你想添加一个新的,你必须明确地这样做。