Заменить значение коэффициента на NA, если условие - PullRequest
1 голос
/ 08 мая 2019

Я хочу заменить значения в факторной переменной в зависимости от другого столбца, не изменяя начальные уровни фактора.

Пример:

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 имеет уровень 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))

Есть ли другой способ очистки (то есть более прямой) для этого?

1 Ответ

1 голос
/ 08 мая 2019

Мы можем использовать replace и избегать шагов 2 и 4. Он сохранит столбец factor как таковой и не приведет factor к integer (если не преобразован в класс 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   
...