2016-10-12 40 views
2

想要基于五种不同语句创建使用ifelse的列。在嵌套ifelse中正确使用“不是”“或”“”AND“布尔值

陈述:

  1. 如果状态= “N” “region_1” “00” “99”,粘贴 “region_2”
  2. 如果状态=“ N“and”region_1“is NOT”00“or”99“,paste”region_1“
  3. 如果状态= “T”,粘贴 “region_1”
  4. 如果状态= “3”,粘贴 “区域”
  5. 如果状态= “W” “region_1” 是NOT “ED”, “FL”, “SG”, “SY”, “XP”, “AL”, “公司”, “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"代码的问题。它不认可我的企图“不是”并且粘贴"region_1"而不是NA(见线4:7)。这可能与state == "N"一样,但是,模拟数据中不满足条件。寻找解决方案。

回答

2

在最近的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 | ... 

Proce因此'e''OR'运算符可以丢弃以下语句(...),因为...的结果无关紧要。

+0

谢谢,这正是需要的。 –

+0

乐意提供帮助。如果此答案或任何其他人解决了您的问题,请将其标记为已接受:) – BonStats

0

它看起来像你可能只是错过了没有空间。您目前有region_1!=“AB”尝试添加一个空格,以便您有region_1!=“AB”

+0

不幸的是仍然得到相同的输出。 –

0

尽管大致相同的打字量,但我更喜欢每次更新数据的子集时使用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