【问题标题】:Is there an R function for nested ifelse functions?嵌套 ifelse 函数是否有 R 函数?
【发布时间】:2019-11-16 19:51:04
【问题描述】:

我正在尝试使用 ifelse 组合许多变量来制作一个虚拟变量来判断某人是否属于某个职业类别。我想知道是否有一个功能可以简化此代码并使其更容易重复前进。 比如我的代码目前是:

occupation_blue_collar <- ifelse(occupation=="Blue Collar", T, 
                          ifelse(occupation =="Blue Collar and Ex-Military", T, 
                          ifelse(occupation == "Blue Collar and Non-military Government", T,
                          ifelse(occupation== "Blue Collar and School Student", T,
                          ifelse(occupation== "Blue Collar and University Student", T,
                          ifelse(occupation== "Blue Collar and White Collar", T,       
                                        F))))))

我必须针对许多变量和许多类别执行此操作,因此我希望有一种方法可以简化。谢谢!

【问题讨论】:

    标签: r if-statement dplyr


    【解决方案1】:

    您可以通过在测试表达式中使用 stringr::str_detect 来简化您的 ifelse 语句 -

    ifelse(str_detect(occupation, “Blue Collar”, TRUE, FALSE))
    

    如果你有很多变量,那么dplyr::case_when 会更好 -

    case_when(str_detect(occupation, “Blue Collar”) ~ TRUE,
              str_detect(occupation, “White Collar) ~ TRUE,
              TRUE ~ FALSE)
    

    【讨论】:

    • 甚至grepl("^Blue Collar", x)
    【解决方案2】:

    请参阅case_when,这应该可以满足您的需求

    library(dplyr)
    mtcars %>% 
      mutate(cg = case_when(carb <= 3 ~ "low",
                            carb > 3  ~ "high"))
    

    【讨论】:

      【解决方案3】:

      occupation=="Blue Collar" | occupation =="Blue Collar and Ex-Military" | ...

      | 是“或”运算符。

      由于您似乎有很多重复的单词(即“Blue Collar”),您应该查看正则表达式,看看您是否可以自动化其中的一些重复。

      【讨论】:

        【解决方案4】:

        解决这个问题的方法很少,但我认为最简单的方法是在 ifelse 语句中使用 OR 逻辑

        ifelse(occupation == "Blue Collar" | occupation == "Blue Collar and Ex-Military" | occupation == "Blue Collar and Non-military Government" | occupation == "Blue Collar and School Student" | occupation == "Blue Collar and University Student", "T", "F")

        但是,如果您必须跨职业多次执行此操作,则有更好的方法来执行此操作。我将创建一个带有标题职业_blue_collar 的csv,并用您想要的所有可能的列填充该列。然后读入csv,并使用 ifelse(occupation %in% df$occupations_blue_collar, "T", "F")。冲洗并重复您的其他职业!

        编辑:正如@markus 所指出的,如果你想在职业_blue_collar 中出现的所有值都包含“蓝领”字样,那么ifelse(grepl("blue collar", occupation), 'T', 'F') 将是处理此问题的最有效方法!过滤掉'蓝领和白领',可以使用ifelse(grepl('blue collar', occupation) &amp; occupation != 'blue collar and white collar', 't', 'f')或者ifelse(grepl('blue col',occupation) & !grepl('white col',occupation), 't', 'f')`

        编辑 2:更改 ||到 |正如@wusel 建议的那样。

        【讨论】:

        • 为什么不grepl("^Blue Collar", x)
        • 小心||,因为它没有矢量化!
        • grepl 返回一个逻辑向量,因此不需要ifelse(顺便说一句,这不是很有效)。只需grepl("^Blue Collar", x)。而不是多个|s 和==s 你可以考虑使用%in%
        • 我不认为 OP 打算将 "T" 分配为字符串,他们打算将 TRUE 分配为逻辑数据类型
        猜你喜欢
        • 1970-01-01
        • 2022-12-14
        • 2015-07-11
        • 2020-11-30
        • 1970-01-01
        • 1970-01-01
        • 2020-07-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多