嵌套ifelse函数是否有R函数?

时间:2019-11-16 19:51:04

标签: r if-statement dplyr

我正在尝试使用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))))))

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

4 个答案:

答案 0 :(得分:3)

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

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)

答案 1 :(得分:1)

请参见case_when,它应该满足您的需求

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

答案 2 :(得分:0)

function f(x, level = 0) { console.log(level, '>>'.repeat(level + 1), x); var v = x === 0 ? 5 : 1 + f(x - 1, level + 1); console.log(level, '<<'.repeat(level + 1), v); return v; } console.log('result', f(4));

其中.as-console-wrapper { max-height: 100% !important; top: 0; }是“或”运算符。

由于您似乎有很多重复的单词(例如“ Blue Collar”),因此应查看正则表达式以查看是否可以自动执行某些重复操作。

答案 3 :(得分:-2)

解决此问题的方法很少,但是我认为最简单的方法是在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]中使用的所有值中都带有单词“ blue衣领”,那么ifelse(grepl("blue collar", occupation), 'T', 'F')将是处理此问题的最有效方法!要过滤掉“蓝领和白领”,您可以使用ifelse(grepl('blue collar', occupation) & occupation != 'blue collar and white collar', 't', 'f')或ifelse(grepl('蓝领',职业)&!grepl('白领',职业),'t','f' )`

编辑2:更改||到|如@wusel建议。