在 R 中使用带日期的逻辑表达式

Using logical expressions with dates in R

我一直致力于根据 R 中的某些记录是否比昨天更新来标记它们,但我要么只返回零,要么收到错误。

我有一个数据框,其中列出了我所有的商店。我有另一个数据框,列出了他们所有商店级别的销售记录(通常是截至昨天的 30 天报告)。我每天都会收到销售报告。我想在店铺列表中打个flag,表示昨天有没有收到店铺的销售报表记录。

为了创建日期,我使用了这段代码(使用 lubridate 包):

today <- as.Date(today(), format= "%m/%d/%Y")
yesterday <- today-1

然后我用if语句遍历代码:

for(i in 1:length(storelist[,1])){
  if ((storelist$Store_NO[i] %in% storesales$Store_No) && (storesales$Calendar.Date == yesterday))
    (storelist$Flag[i] <- 1)
    else (storelist$Flag[i] <- 0)
}

注意:storesales 数据框中的日期在 m/d/y 中,但我不确定这是否会产生影响。

但是,当我这样做时,所有 'flag' 列都填充了零,尽管我知道至少有一个或两个昨天报告了销售额。

我该如何解决这个问题?在 excel 中,这将是一个非常简单的 SUMIF(其中第一个条件是商店号,第二个条件是日期),但我无法将其转换为 R.

感谢大家的帮助!

没有可重复的数据进行测试,这是一个粗略的猜测,但它应该有效:

storelist$Flag <- (storesales$Store_No %in% storelist$Store_NO &   
                   storesales$Calendar.Date == yesterday)+0L

数据示例

我使用内置的 mtcars 数据集测试上述解决方案的结构,我将创建一个标志列来检查汽缸变量是 4 还是 6,以及马力变量是 110 还是 175 :

mtcars$Flag <- (mtcars$cyl %in% c(4,6) & mtcars$hp %in% c(110, 175))+0L
mtcars
#                    mpg cyl disp  hp drat    wt  qsec vs am gear carb Flag
# Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4    1
# Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4    1
# Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1    0
# Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1    1
# Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2    0
# Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1    0

来自逻辑运算符的帮助页面,可通过“?&&”访问:

&和&&表示逻辑AND和|和||表示逻辑或。较短的形式以与算术运算符大致相同的方式执行逐元素比较。较长的形式从左到右评估,仅检查每个向量的第一个元素。评估只进行到确定结果为止。较长的形式适用于编程控制流,通常在 if 子句中首选。

例如比较两者的区别

> c(1,0,1) & c(1,1,0)
[1]  TRUE FALSE FALSE
> c(1,0,1) && c(1,1,0)
[1] TRUE