ifelse语句,用于条件的多种组合

时间:2019-01-15 00:52:18

标签: r

我经常遇到要编写包含多个条件组合的ifelse语句的情况,而最终我只写出了符合我的条件的所有可能组合。我确信必须有一种更有效的方法。

observation <- c(1:3, 1:3, 1:3, 1:3)
var1 <- c(0, 0.3, 0.3, 5, -0.3, -0.6, -4, 6,-0.75, 0.75, 3, 0.75)
dat <- as.data.frame(cbind(observation, var1))

在此示例中,我有兴趣为第二次观察期间出现的极值(即大于1或小于-1的值)创建标志。

我希望有某种方法可以让R进行一些操作,例如创建一个标志如果观察== 2并且EITHER var1> 1或var1 <-1,将其设置为1,否则将其设置为0

但是我所知道的最好的办法是编写单独的嵌套ifelse语句,例如

dat$flag <- with(dat, ifelse(observation == 2 & var1 > 1, 1, 
ifelse(observation == 2 & var1 < -1, 1, 0)))

显然在示例案例中这并不可怕,但是我经常遇到很多组合条件-就像我想标记2014-2018年9-12年级学生的所有记录一样,这也意味着标记有关2013年9-11年级学生,2012年9-10年级学生和2011年9年级学生的记录。 感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

在这种情况下,您甚至都不需要ifelse。您可以通过组合两个条件

+with(dat, observation == 2 & (var1 > 1 | var1 < -1))
#[1] 0 0 0 0 0 0 0 1 0 0 1 0

通过ifelse,您可以使用like

dat$flag <- with(dat, ifelse(observation == 2 & (var1 > 1 |var1 < -1), 1, 0))

#   observation  var1 flag
#1            1  0.00    0
#2            2  0.30    0
#3            3  0.30    0
#4            1  5.00    0
#5            2 -0.30    0
#6            3 -0.60    0
#7            1 -4.00    0
#8            2  6.00    1
#9            3 -0.75    0
#10           1  0.75    0
#11           2  3.00    1
#12           3  0.75    0

答案 1 :(得分:1)

如@RonakShah所述,您可以避免使用ifelse()或不嵌套使用它。 但是,如果您需要嵌套ifelse() ,则可以使用dplyr::case_when()

require(tidyverse)

dat %>% 
  mutate(flag1WithIfelse = ifelse(observation == 2 & (var1 > 1 |var1 < -1), 
                                  1, 0), 
         flag2WithCaseWhen = case_when(
           observation == 2 & (var1 > 1 |var1 < -1) ~ 1, 
           TRUE ~ 0))


   observation  var1 flag1WithIfelse flag2WithCaseWhen
1            1  0.00               0                 0
2            2  0.30               0                 0
3            3  0.30               0                 0
4            1  5.00               0                 0
5            2 -0.30               0                 0
6            3 -0.60               0                 0
7            1 -4.00               0                 0
8            2  6.00               1                 1
9            3 -0.75               0                 0
10           1  0.75               0                 0
11           2  3.00               1                 1
12           3  0.75               0                 0