在 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
我一直致力于根据 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