如果有条件,用 NA 替换因子值
Replace factor value by NA if condition
我想根据另一列替换因子变量中的值,同时不更改初始因子水平。
示例:
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))
是否有另一种更清洁(即更直接)的方法来做到这一点?
我们可以使用 replace
并避免第 2 步和第 4 步。它会保持 factor
列不变,并且不会将 factor
强制转换为 integer
(除非转换为 character
class) 如 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
我想根据另一列替换因子变量中的值,同时不更改初始因子水平。
示例:
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))
是否有另一种更清洁(即更直接)的方法来做到这一点?
我们可以使用 replace
并避免第 2 步和第 4 步。它会保持 factor
列不变,并且不会将 factor
强制转换为 integer
(除非转换为 character
class) 如 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