【问题标题】:Using logical expressions with dates in R在 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。

感谢大家的帮助!

【问题讨论】:

    标签: r date if-statement for-loop logic


    【解决方案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 文件是按日期排列的(因为每天包括前几天。
      猜你喜欢
      • 2014-08-24
      • 2021-06-21
      • 1970-01-01
      • 2017-08-30
      • 1970-01-01
      • 1970-01-01
      • 2023-01-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多