【问题标题】:Changing elements of a factor vector based on logical conditions in R根据 R 中的逻辑条件更改因子向量的元素
【发布时间】: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


    【解决方案1】:

    这是一个选项,它只遍历“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
    

    【讨论】:

    • 这会产生一个字符向量。我想如果你将它包含在'factor()'中,它会是一个单行。是否可以在不转换为“字符”的情况下更改相关元素?
    • 哦,我看到问题只是转换黑白字符和因子之间的额外步骤。将原始解决方案包装在 as.factor 中也可以解决问题: as.factor(ifelse(is.na(fact0) & sel, "no", char))
    • 是的,但感谢您的努力。如果没有人提出更好的答案,将在一段时间后接受您的答案。不过,请使用封闭因子()对其进行编辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-24
    • 1970-01-01
    • 1970-01-01
    • 2020-04-17
    • 1970-01-01
    • 2021-06-20
    • 1970-01-01
    相关资源
    最近更新 更多