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

Posted

技术标签:

【中文标题】在 R 中使用带有日期的逻辑表达式【英文标题】:Using logical expressions with dates in R 【发布时间】:2015-09-26 11:18:06 【问题描述】:

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

我有一个列出我所有商店的数据框。我有另一个数据框,列出了他们所有的商店级销售记录(通常是截至昨天的 30 天报告)。我每天都会收到销售报告。我想在商店列表中放置一个标志,表明我昨天是否收到了该商店的销售报告记录。

为了创建日期,我使用了这段代码(使用 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 为单位,但我不确定这是否会产生影响。

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

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

感谢大家的帮助!

【问题讨论】:

【参考方案1】:

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

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

例如比较两者的区别

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

感谢您的帮助。我尝试按照描述应用该方法,但现在我得到 Error in $(*tmp*, "Flag2", value = c(0L, 0L, 0L, 0L, : replacement has 40296 rows, data has 7096... 这是因为 storesales 文件是按日期排列的(因为每天包括前几天。

以上是关于在 R 中使用带有日期的逻辑表达式的主要内容,如果未能解决你的问题,请参考以下文章

5逻辑匹配

5逻辑匹配

如何使用逻辑运算符评估前缀表达式

R expss use_labels 和 dplyr 逻辑

用已知变量解析字符串中的逻辑表达式

Java编程的逻辑 (91) - Lambda表达式