在 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 中使用带有日期的逻辑表达式的主要内容,如果未能解决你的问题,请参考以下文章