根据R

时间:2016-05-18 17:04:44

标签: r if-statement vector logic na

是否有一种方便且通用的方法可以根据逻辑条件更改因子向量的元素(包含各种因子级别和缺失值作为元素)(在这种情况下:对于向量的子集,将缺失值更改为因子在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(),但这似乎将因子向量转换为&#34;字符&#34;或&#34;数字&#34;,像这样:

ifelse(is.na(fact) & sel, "no", fact)
ifelse(is.na(fact) & sel, 2, fact)

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"

一个丑陋的解决方案是将因子向量更改为&#34;字符&#34;,对此进行ifelse(),并转换回一个因子,如下所示:

char <- as.character(fact)
char2 <- ifelse(is.na(char) & sel, "no", char)
fact2 <- factor(char2)
fact2 #This is the desired output

没有这种转换技巧,有更优雅的方法吗?

1 个答案:

答案 0 :(得分:0)

这是一个只是遍历&#34; fact0&#34;向量并用&#34; no&#34;替换任何NA值。在&#34; sel&#34;中的相同索引是真的

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