根据数据框中的一行数据创建条件标志

Creating a conditional flag based on a row of data from a dataframe

编程新手,请多多包涵我的简单问题!

我有一个数据框:

date <- c(today()+1, today()+2, today()+3, today()+4, today()+5, today()+6)
precipitation <- c(0, 0, 35, 0, 0, 35)
weatherdataframe <- data.frame(date, precipitation)

我有另一个数据框:

date2 <- c(today()-4, today()-7)
flag2 <- c("35mm24hrs", "10mm1hr")
emaillog <- data.frame(date2, flag2)

我正在尝试检查每个日期的预计降雨量是否超过 35 毫米。如果是,则检查该日期是否在今天的 3 天内。如果是,则检查电子邮件日志以确保在今天的 7 天内没有发送过电子邮件,或者电子邮件日志是否为空。

如果满足所有这些条件,例如,只需:

paste("flagged")

我一直在尝试使用 if 语句

if(((weatherdataframe$precipitation >= 35)&(weatherdataframe$date <= (today()+3)))&&
((emaillog$date2 <= (today() -7))||(length(unlist(emaillog$date2)) == 0))) {
paste("flagged")
}

但收到错误

Warning message:
In if (weatherdataframe$precipitation>= 35) { :
  the condition has length > 1 and only the first element will be used

正如@akrun 在评论中所说,使用 ifelse 对此更有意义,因为它是矢量化的(请参阅 了解更多说明)并且您可能想使用 any()all() 还有,例如

library(tidyverse)
library(lubridate)

date <- c(today()+1, today()+2, today()+3, today()+4, today()+5, today()+6)
precipitation <- c(0, 0, 35, 0, 0, 35)
weatherdataframe <- data.frame(date = date, precipitation = precipitation)
date2 <- c(today()-4, today()-7)
flag2 <- c("35mm24hrs", "10mm1hr")
emaillog <- data.frame(date2, flag2)

ifelse(
  any((weatherdataframe$precipitation >= 35) & (weatherdataframe$date <= (today() + 3)))
  && 
  any(all((emaillog$date2 <= (today() -7)), (length(unlist(emaillog$date2)) == 0))),
  paste("flagged"), 
  paste("nothing flagged")
  )
#> [1] "flagged"