【问题标题】:How to combine several conditions with logical operators for a Boolean vector or if statement如何将多个条件与逻辑运算符组合用于布尔向量或 if 语句
【发布时间】:2020-01-05 09:31:23
【问题描述】:

我有以下数据框:

Category <- rep(c("FACE", "LIP", "BODY", "HAIR", "SUN"), each = 2)
Month <- c("October", "Janurary", "April", "Feburary", "November", 
"August", "October", "May", "June", "December")
df2 <- data.frame(Category, Month)

  Category    Month
1      FACE  Oktober
2      FACE Janurary
3       LIP    April
4       LIP Feburary
5      BODY November
6      BODY   August
7      HAIR  October
8      HAIR      May
9       SUN     June
10      SUN December

如果 FACE、LIP、BODY 或 HAIR 类别在十月、十一月或十二月,并且如果类别太阳在四月、五月、六月或七月,我想添加另一列“旺季”= TRUE。

结果应该是这样的:

   Category    Month high_season_result
1      FACE  October               TRUE
2      FACE Janurary              FALSE
3       LIP    April              FALSE
4       LIP Feburary              FALSE
5      BODY November               TRUE
6      BODY   August              FALSE
7      HAIR  October               TRUE
8      HAIR      May              FALSE
9       SUN     June               TRUE
10      SUN December              FALSE

我试过这段代码:

df2$high_season <- (df2$Category == "FACE" & ((df2$Month == "October") | 
(df2$Month == "November") | (df2$Month == "December"))) | (df2$Month == 
"BODY" & ((df2$Month == "October") | (df2$Month == "November") |                       
(df2$Month == "December"))) | (df2$Category == "LIP" &                                                       
((df2$Month == "October") |                                                            
(df2$Month == "November") |                                                            
(df2$Month == "December"))) | 
  (df2$Category == "HAIR" & ((df2$Month == "October") | (df2$Month == 
November") | (df2$Month == "December"))) | (df2$Month == "SUN" &                                                              
((df2$Month == "April") |                                               
(df2$Month == "May") |                                                             
(df2$Month == "June") |                                                               
(df2$Month == "July")))

布尔值搞砸了:

   Category    Month high_season
1      FACE  October        TRUE
2      FACE Janurary       FALSE
3       LIP    April       FALSE
4       LIP Feburary       FALSE
5      BODY November       FALSE
6      BODY   August       FALSE
7      HAIR  October        TRUE
8      HAIR      May       FALSE
9       SUN     June       FALSE
10      SUN December       FALSE

我试图删除代码中的括号,然后布尔值发生了变化,但仍然不是正确的结果。我怀疑我用括号或逻辑运算符搞砸了。

有人可以帮忙吗?

【问题讨论】:

标签: r if-statement boolean logical-operators


【解决方案1】:

这可以通过逻辑向量而不是长逻辑条件来完成。

i1 <- df2$Category %in% c("FACE", "LIP", "BODY", "HAIR")
j1 <- df2$Month %in% c("October", "November", "December")
i2 <- df2$Category %in% "SUN"
j2 <- df2$Month %in% c("April", "May", "June", "July")
df2$high_season_result <- (i1 & j1) | (i2 & j2)

df2
#   Category    Month high_season_result
#1      FACE  October               TRUE
#2      FACE Janurary              FALSE
#3       LIP    April              FALSE
#4       LIP Feburary              FALSE
#5      BODY November               TRUE
#6      BODY   August              FALSE
#7      HAIR  October               TRUE
#8      HAIR      May              FALSE
#9       SUN     June               TRUE
#10      SUN December              FALSE

【讨论】:

  • 这成功了!谢谢!我在加载 dplyr 包时遇到问题,但我使用 R 基础编写了相同的逻辑并且它工作得非常好!
  • @Morasc 为什么需要加载dplyr 包?
【解决方案2】:

试试这个

season <- c('FACE', 'LIP', 'BODY', 'HAIR')
month1 <- c('Oktober', 'November', 'December', 'October')
sun <- c('April', 'May', 'June', 'July')
#df2$high_season <- ifelse((df2$Category %in% season &(df2$Month %in%month1) | (df2$Category == 'SUN' & df2$Month %in% sun)), TRUE, FALSE)
df2$high_season <- df2$Category %in% season &(df2$Month %in%month1) | (df2$Category == 'SUN' & df2$Month %in% sun)
# -------------------------------------------------------------------------

#       Category    Month     high_season
# 1      FACE       October   TRUE
# 2      FACE       Janurary  FALSE
# 3       LIP       April     FALSE
# 4       LIP       Feburary  FALSE
# 5      BODY       November  TRUE
# 6      BODY       August    FALSE
# 7      HAIR       October   TRUE
# 8      HAIR       May       FALSE
# 9       SUN       June      TRUE
# 10      SUN       December  FALSE

【讨论】:

  • 你不需要ifelse这里df2$Category %in% season &amp; (df2$Month %in% month1) | (df2$Category == 'SUN' &amp; df2$Month %in% sun)已经给你一个逻辑向量。
  • 感谢@RonakShah,但出于好奇,ifelse() 是否会引入额外的效率负载?
  • 我不确定,但在不需要时它看起来像是额外的代码。
  • ifelse 较慢,因为它会为yes 部分和no 部分创建与条件相同大小的向量。
  • 同意,额外使脚本冗长。以ifelse() 开始解决方案,但没有意识到%in% 返回一个逻辑向量。再次感谢。
【解决方案3】:

使用 @Rui Barradas 建议的向量解决了问题,但使用 R 基础而不是 dplyr 包:

Cat1 <- df2$Category == "FACE" | df2$Category == "LIP" | df2$Category == "BODY" | 
df2$Category == "HAIR"
Mo1 <- df2$Month == "October" | df2$Month == "November" | df2$Month == "December"
Cat2 <- df2$Category == "SUN"
Mo2 <- df2$Month == "April" | df2$Month == "May" | df2$Month == "June" | df2$Month == 
"July"
df2$high_season_result <- (Cat1 & Mo1) | (Cat2 & Mo2)

   Category    Month high_season_result
1      FACE  October               TURE
2      FACE Janurary              FALSE
3       LIP    April              FALSE
4       LIP Feburary              FALSE
5      BODY November               TURE
6      BODY   August              FALSE
7      HAIR  October               TRUE
8      HAIR      May              FALSE
9       SUN     June               TRUE
10      SUN December              FALSE

非常感谢!

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-03
  • 2017-06-15
  • 1970-01-01
  • 1970-01-01
  • 2013-06-20
相关资源
最近更新 更多