我经常遇到要编写包含多个条件组合的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年级学生的记录。 感谢您的帮助!
答案 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