【问题标题】:Correct use of "IS NOT" "OR" & "AND" boolean in nested ifelse在嵌套 ifelse 中正确使用“IS NOT”“OR”和“AND”布尔值
【发布时间】:2016-10-12 03:16:06
【问题描述】:

想根据五个不同的语句使用 ifelse 创建一个列。

声明:

  1. 如果 state = "N" and "region_1" is "00" or "99",粘贴“region_2”
  2. 如果 state = "N" and "region_1" is NOT "00" or "99",粘贴“region_1”李>
  3. 如果 state = "T",粘贴 "region_1"
  4. 如果 state = "3",粘贴 "region"
  5. 如果 state = "W" and "region_1" is NOT "ED", "FL", "SG", "SY", "XP", " AL”、“AG”、“EB”“AB”,粘贴“region_1”

模拟数据:

state = c("T","3","W", "W","W","W","W","N","N","N","Q","Q","N","Q")
region = c("CD","AB","IC","IS", "IE", "IF", "IA", "A2", "A9", "A9", "GW", "AW", "K0", "DW")
region_1 = c("DG","BC","CL","SY","ED", "FL", "AL", "23", "99", "99", "WB", "WD", "02", 'WW')
region_2 = c("00", "D1", "05", "00", "00", "01", "59", "00", "23", "24", '03', "03", "37", "03")

 a <- data.frame(state, region, region_1, region_2)

我试图解决的问题:

library(dplyr)     
b <- a %>% mutate(t = ifelse(state == "N" & region_1 == "99" | state == "N" & region_1=="00" , region_2,          
             ifelse(state == "N" & region_1 != "99" | state == "N" & region_1 != "00", region_1,  
             ifelse(state == "T", region_1,                                                
             ifelse(state == "3", region, 
             ifelse(state == "W" & region_1 != "ED" | state == "W" & region_1 != "FL" | state == "W" & region_1 != "SG" | state == "W" & region_1 != "SY" | state == "W" & region_1 != "XP" | state == "W" & region_1 != "AL" | state == "W" & region_1 != "AG" | state == "W" & region_1 != "EB" | state == "W" & region_1!= "AB", region_1,
           NA))))))

问题

state == "w" 代码的输出存在问题。它无法识别我尝试的“IS NOT”并粘贴 "region_1" 而不是 NA(参见第 4:7 行)。 state == "N" 可能也发生了同样的情况,但是,模拟数据中不满足条件。正在寻找解决方案。

【问题讨论】:

    标签: r if-statement nested boolean


    【解决方案1】:

    最后一个ifelse 语句中有错误。您可以使用 %in% 运算符简化语法。根据您提供的逻辑,我认为您正在寻找的嵌套ifelse 可以表示为:

    ifelse(state == "N" & region_1 %in% c("99","00") , region_2,          
     ifelse(state == "N" & ! region_1 %in% c("99","00"), region_1,  
      ifelse(state == "T", region_1,                                                
        ifelse(state == "3", region, 
         ifelse(state == "W" & ! region_1 %in% c("ED", "FL", "SG", "SY", "XP", "AL", "AG", "EB", "AB"), region_1, NA)
              ))))
    

    希望对您有所帮助。

    编辑

    在您的最后一个 ifelse 语句中,考虑逻辑表达式的第一个组件:

     state == "W" & region_1 != "ED" | ...
    

    在您的数据框的第四行,我们有 state = "W"region_1 = "SY" 因此上面的行将评估为

    TRUE & TRUE | ...
    

    因为... 的结果无关紧要,接下来的“OR”运算符可以丢弃以下语句 (...)。

    【讨论】:

    • 谢谢,这正是我们所需要的。
    • 乐于助人。如果此答案或任何其他答案解决了您的问题,请将其标记为已接受:)
    【解决方案2】:

    看起来您可能只是缺少了 not 中的空格。您目前有 region_1!= "AB" 尝试添加一个空格,这样您就有了 region_1 != "AB"

    【讨论】:

    • 不幸的是仍然得到相同的输出。
    【解决方案3】:

    虽然输入的数量大致相同,但我更喜欢使用 data.table 的按引用更新 (:=),每次更新数据的子集。我觉得它更简洁,更容易阅读

    library(data.table)
    
    setDT(a)
    
    a[state == "N" & region %in% c("00","99"), t := region_2]
    a[state == "N" & !region %in% c("00","99"), t := region_1]
    a[state == "T", t := region_1]
    a[state == "3", t := region]
    a[state == "W" & !region_1 %in% c("ED", "FL","SG","SY","XP","AL","AG","EB","AB"), t := region_1]
    
    a
    #     state region region_1 region_2  t
    #  1:     T     CD       DG       00 DG
    #  2:     3     AB       BC       D1 AB
    #  3:     W     IC       CL       05 CL
    #  4:     W     IS       SY       00 NA
    #  5:     W     IE       ED       00 NA
    #  6:     W     IF       FL       01 NA
    #  7:     W     IA       AL       59 NA
    #  8:     N     A2       23       00 23
    #  9:     N     A9       99       23 99
    # 10:     N     A9       99       24 99
    # 11:     Q     GW       WB       03 NA
    # 12:     Q     AW       WD       03 NA
    # 13:     N     K0       02       37 02
    # 14:     Q     DW       WW       03 NA
    
    # setDF(a)   ## to turn it back into a data.frame
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-12
      • 2022-07-29
      相关资源
      最近更新 更多