【问题标题】:ifelse statements for multiple combinations of conditions多个条件组合的 ifelse 语句
【发布时间】:2019-01-15 00:52:18
【问题描述】:

我经常遇到这样的情况,我想编写包含多个条件组合的 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 并且 var1 > 1 或 var1

但我知道最好的办法是编写单独的嵌套 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 年级学生的记录。但希望这个例子能帮助大家理解:) 感谢您的帮助!

【问题讨论】:

  • ifelse(abs(var1) &gt; 1, 1, 0)

标签: r


【解决方案1】:

在这种情况下,您甚至不需要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

【讨论】:

  • 组合条件是可能的,但您的第一个示例看起来错误:它应该有 dat 而不是 df,并且应该返回 TRUEFALSE 值,而不是 0 和 1。
  • @user2554330 谢谢。我错误地使用了df。就输出而言,它将是 1/0 而不是 TRUE/FALSE,因为前面有 +。检查+with(dat, observation == 2 &amp; (var1 &gt; 1 | var1 &lt; -1))with(dat, observation == 2 &amp; (var1 &gt; 1 | var1 &lt; -1)) 的输出差异
  • 谢谢。我会在您的答案中添加该解释,否则 + 看起来像是一个错字。
【解决方案2】:

正如@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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多