根据 R 中的逻辑条件更改因子向量的元素
Changing elements of a factor vector based on logical conditions in R
是否有一种方便且通用的方法来根据逻辑条件更改因子向量的元素(包含各种因子水平和缺失值作为元素)(在这种情况下:对于向量的子集,将缺失值更改为R 中的因子水平)?
给定因子向量 (fact
) 和此处生成的逻辑向量 (sel
):
fact0 <- c("no","no","maybe",NA,"yes","yes","no","no",NA,NA,"maybe")
fact <- factor(fact0)
sel <- c(FALSE,TRUE,TRUE,TRUE,TRUE,FALSE,TRUE,TRUE,TRUE,FALSE,TRUE)
所需的输出:
[1] no no maybe no yes yes no no no <NA> maybe
Levels: maybe no yes
我的第一个想法是使用 ifelse()
,但这似乎将因子向量转换为 "character" 或 "numeric",如下所示:
ifelse(is.na(fact) & sel, "no", fact)
ifelse(is.na(fact) & sel, 2, fact)
A related question 基于 levels()
给出了一个有趣的答案,但该解决方案无法将缺失值作为逻辑条件的一部分处理:
levels(fact)[which(is.na(fact) & sel)] #Output is "[1] NA NA"
levels(fact)[which(is.na(fact) & sel)] <- "no"
levels(fact)[which(is.na(fact) & sel)] #Still "[1] NA NA"
一个丑陋的解决方案是将因子向量更改为 "character",对其执行 ifelse()
,然后转换回因子,如下所示:
char <- as.character(fact)
char2 <- ifelse(is.na(char) & sel, "no", char)
fact2 <- factor(char2)
fact2 #This is the desired output
有没有没有这个转换技巧的更优雅的方法?
这是一个仅遍历 "fact0" 向量并将任何 NA 值替换为 "no" 的选项,其中 "sel" 中的相同索引为 TRUE
sapply(seq_along(fact0), function(i) as.factor(ifelse(sel[i] & is.na(fact0[i]), "no", fact0[i])))
[1] no no maybe no yes yes no no no <NA> maybe
Levels: no maybe yes
是否有一种方便且通用的方法来根据逻辑条件更改因子向量的元素(包含各种因子水平和缺失值作为元素)(在这种情况下:对于向量的子集,将缺失值更改为R 中的因子水平)?
给定因子向量 (fact
) 和此处生成的逻辑向量 (sel
):
fact0 <- c("no","no","maybe",NA,"yes","yes","no","no",NA,NA,"maybe")
fact <- factor(fact0)
sel <- c(FALSE,TRUE,TRUE,TRUE,TRUE,FALSE,TRUE,TRUE,TRUE,FALSE,TRUE)
所需的输出:
[1] no no maybe no yes yes no no no <NA> maybe
Levels: maybe no yes
我的第一个想法是使用 ifelse()
,但这似乎将因子向量转换为 "character" 或 "numeric",如下所示:
ifelse(is.na(fact) & sel, "no", fact)
ifelse(is.na(fact) & sel, 2, fact)
A related question 基于 levels()
给出了一个有趣的答案,但该解决方案无法将缺失值作为逻辑条件的一部分处理:
levels(fact)[which(is.na(fact) & sel)] #Output is "[1] NA NA"
levels(fact)[which(is.na(fact) & sel)] <- "no"
levels(fact)[which(is.na(fact) & sel)] #Still "[1] NA NA"
一个丑陋的解决方案是将因子向量更改为 "character",对其执行 ifelse()
,然后转换回因子,如下所示:
char <- as.character(fact)
char2 <- ifelse(is.na(char) & sel, "no", char)
fact2 <- factor(char2)
fact2 #This is the desired output
有没有没有这个转换技巧的更优雅的方法?
这是一个仅遍历 "fact0" 向量并将任何 NA 值替换为 "no" 的选项,其中 "sel" 中的相同索引为 TRUE
sapply(seq_along(fact0), function(i) as.factor(ifelse(sel[i] & is.na(fact0[i]), "no", fact0[i])))
[1] no no maybe no yes yes no no no <NA> maybe
Levels: no maybe yes