【问题标题】:How to check if conditions are met in consecutive days (in R)如何检查是否连续几天满足条件(在R中)
【发布时间】:2021-01-20 16:57:48
【问题描述】:

我对 R 相当陌生,我正在尝试确定满足两个条件的位置

  1. 前两天至少售出 7 件或更多商品
  2. 前两天至少 3 小时售出 80 件或更多的商品

这将在满足这两个条件的日子里显示在闪亮的应用程序中。

我想过用data.table:

group_by(group = data.table::rleid(items_sold < 80),
                         group1 = cumsum(date_time - lag(date_time, default = first(date_time)) > 3600)) 

但这看起来是连续几个小时...... 我完全迷路了,非常欢迎任何帮助!

我的数据集: My_dataset

【问题讨论】:

  • 请不要将数据共享为图像。使用dput(df) 并将输出粘贴到此处。
  • 不太明白这个问题,但是您可以使用'difftime'来获取两个日期之间的天数。只需difftime(some_date, some_other_date, units = "days")

标签: r dplyr data.table


【解决方案1】:

使用包 lubridatedplyr 按天分组时间

如果您将 your_data 替换为您所称的数据,这应该可以工作。

你的条件正确吗?感觉应该是 80 件商品在两天内至少三个小时内完成了 7 次以上的销售?

请注意,您的问题有点模棱两可 - 我将其视为“两天内总共有 n 次销售”,而不是“至少有 n 次销售”每天两天”。如果您想要后者,则需要调整此代码。

这里的%&gt;% 操作符是一个管道 - 它接受它前面的任何内容并将其作为下一个函数的第一个参数。所以x %&gt;% f(y = 2) 等价于f(x, y = 2)

# You'll need these packages
require(dplyr)
require(lubridate)

### Creating a 'daily sales' column
 your_data %>%
   ## Group the hours into days w/ lubridate::ymd()
   group_by(lubridate::ymd(date_time)) %>%
   ## Create two new columns: items sold per day, and total hours
   ## in the day that sales exceeded 80
   mutate(sales_today = sum(items_sold),
          hours_exceeding = sum(items_sold >= 80)) %>% 
   # ungroup and overwrite
   ungroup -> your_data 

### Get columns for previous two days
 your_data %>% 
   group_by(lubridate::ymd(date_time)) %>% # still 'thinking in days'
   ## 'shift' existing columns to compare each day with previous two
   mutate(sales_yesterday = lag(sales_today, n = 1),
          sales_day_before = lag(sales_today, n = 2),
          hours_exceeding_yesterday = lag(hours_exceeding, n = 1),
          hours_exceeding_day_before = lag(hours_exceeding, n = 2)
          ) %>% 
   ## Use new columns to get totals for previous two days
   mutate(sales_last_two_days =
            sales_yesterday + sales_day_before,
          hours_exceeding_last_two_days =
            hours_exceeding_yesterday + hours_exceeding_day_before) %>% 
   ## Drop unwanted columns
   select(-sales_yesterday, -sales_day_before,
          -hours_exceeding_yesterday, -hours_exceeding_day_before) %>%  
   ## Create a logical which indicates that the criteria are met
   mutate(meets_criteria = 
            hours_exceeding_last_two_days >= 3 &
            sales_last_two_days >= 7) %>% 
   ungroup -> your_data

【讨论】:

  • 嗨@Captain Hat,感谢您的精彩回答。它给了我一些好主意。我应该更好地制定第 2 点,我的意思是“检查连续 2 天是否至少有 3 小时售出 80 多件商品” - 我会尝试看看我是否可以从那里到达那里你的答案:)
猜你喜欢
  • 2021-04-25
  • 2018-06-30
  • 2016-05-30
  • 1970-01-01
  • 2017-05-22
  • 1970-01-01
  • 2021-10-04
  • 1970-01-01
  • 2022-07-30
相关资源
最近更新 更多