【发布时间】:2016-05-18 17:04:44
【问题描述】:
是否有一种方便通用的方法可以根据逻辑条件(在这种情况下:对于向量的一个子集,将缺失值更改为一个因子)来更改因子向量的元素(包含各种因子水平和缺失值作为元素)水平)在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(),但这似乎将因子向量转换为“字符”或“数字”,如下所示:
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"
一个丑陋的解决方案是将因子向量更改为“字符”,对此执行ifelse(),然后转换回因子,如下所示:
char <- as.character(fact)
char2 <- ifelse(is.na(char) & sel, "no", char)
fact2 <- factor(char2)
fact2 #This is the desired output
没有这个转换技巧有没有更优雅的方法?
【问题讨论】:
标签: r if-statement vector logic na