R 如果条件为NA,则将因子值替换为NA

R 如果条件为NA,则将因子值替换为NA,r,tidyverse,forcats,R,Tidyverse,Forcats,我希望根据另一列替换因子变量中的值,同时不更改初始因子级别 例如: x <- structure(list(Payee = structure(c(NA, 1L, 2L), .Label = c("0", "x"), class = "factor"), PayeeID_Hash = structure(c(NA, 1L,2L), .Label = c("0x31BCA02","0xB672841"), class = "factor")), row.names = c(NA,"tb

我希望根据另一列替换因子变量中的值,同时不更改初始因子级别

例如:

x <- structure(list(Payee = structure(c(NA, 1L, 2L),
 .Label = c("0", "x"), class = "factor"), PayeeID_Hash = structure(c(NA, 1L,2L), 
.Label = c("0x31BCA02","0xB672841"), class = "factor")),
 row.names = c(NA,"tbl", "data.frame"))
> x
# A tibble: 3 x 2
  Payee PayeeID_Hash
  <fct> <fct>       
1 NA    NA          
2 0     0x31BCA02   
3 x     0xB672841  
我可以通过将因子转换为角色,然后再转换为因子:

x %>%
  mutate(PayeeID_Hash = as.character(PayeeID_Hash),
         PayeeID_Hash = ifelse(Payee == "0", NA_character_, PayeeID_Hash),
         PayeeID_Hash = as.factor(PayeeID_Hash))

是否有其他更干净的方法(即更直接的方法)来实现这一点?

我们可以使用
替换
并避免第2步和第4步。它将保持
factor
列的原样,并且不会像
ifelse
那样强制
factor
整数
(除非转换为
字符
类)

library(dplyr)
x %>%
   mutate(PayeeID_Hash = droplevels(replace(PayeeID_Hash, Payee == "0", NA)))
# A tibble: 3 x 2
#  Payee PayeeID_Hash
#  <fct> <fct>       
#1 <NA>  <NA>        
#2 0     <NA>        
#3 x     0xB672841   
库(dplyr)
x%>%
mutate(payeid_Hash=droplevels(替换(payeid_Hash,Payee==“0”,NA)))
#一个tibble:3x2
#收款人收款人
#          
#1           
#2 0             
#3 x 0xB672841
library(dplyr)
x %>%
   mutate(PayeeID_Hash = droplevels(replace(PayeeID_Hash, Payee == "0", NA)))
# A tibble: 3 x 2
#  Payee PayeeID_Hash
#  <fct> <fct>       
#1 <NA>  <NA>        
#2 0     <NA>        
#3 x     0xB672841