1

我想根据另一列替换因子变量中的值,同时不更改初始因子水平。

例子:

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  

Payee为'0'时,则对应的PayeeID_Hash值不应该存在(即应该是NA)。请注意,我不想删除因子级别0x31BCA02(它将出现在Payee具有 level的其他行中x)。另外,我想保持PayeeID_Hash水平不变(我不想用其他值替换它们)。

预期输出:

> x
# A tibble: 3 x 2
  Payee PayeeID_Hash
  <fct> <fct>       
1 NA    NA          
2 0     NA          
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))

是否有另一种更清洁(即更直接)的方法来做到这一点?

4

1 回答 1

1

我们可以使用replace并避免第 2 步和第 4 步。它会保持factor列不变并且不会强制转换factorinteger(除非转换为character类),如ifelse

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   
于 2019-05-08T13:08:33.733 回答