给定特定数据行中的日期,R过滤过去的日期

时间:2018-08-23 06:15:34

标签: r dplyr

我有一个与R中日期过滤有关的问题。例如,我发现这个连结 dplyr filter on Date,它回答了如何在特定日期范围内借助dplyr进行过滤的问题。我想选择一个动态范围,例如计算特定窗口中关键任务的数量,例如从数据集中的当前日期开始的最后7天。我想到的代码看起来像这样:

my.data %>% 
group_by(category) %>% 
filter(date > date - days(7) & date <= date) %>% 
mutate(ncrit = sum(critical == 'yes'))

这不能正常工作。有没有办法让它与dplyr一起运行?

编辑:

对于不清楚的帖子表示歉意。首先要完成这篇文章的想法:想象一下计算机正在运行作业。如果计算机在过去的x天中未能计算出作业,则很可能也无法计算当前作业。虚拟数据集包括计算机类别(例如A / B),日期和故障(是/否)

使用来自Rui Barradas的数据集,我想用dplyr添加以下列“过去3天内的关键作业数量”(在这种情况下,x = 3):

head(my.data, 7)
  category       date critical number of critical jobs in past 3 days
1        A 2018-08-14      yes                                     NA
2        A 2018-08-15       no                                     NA
3        A 2018-08-16      yes                                     NA
4        A 2018-08-17       no                                      2
5        A 2018-08-18      yes                                      1
6        A 2018-08-19       no                                      2
7        A 2018-08-20      yes                                      1

数据(瑞·巴拉达斯):

set.seed(3635)
my.data <- data.frame(category = rep(c('A', 'B'), each = 10), #
                  date = rep(seq(Sys.Date() - 9, Sys.Date(), by = 'days')),
                  critical = sample(c('no', 'yes'), 20, TRUE))

3 个答案:

答案 0 :(得分:1)

没有示例数据集,这很难说,但是鉴于您对问题的描述,我相信以下内容是正确的。
该代码使用了软件包rollapplyr中的函数zoo,其灵感来自于this question的第二个答案。

library(zoo)
library(dplyr)

sumCrit <- function(DF, crit = "yes", window = 3){
    DF %>%
        group_by(category) %>%
        mutate(ncrit = rollapplyr(critical == crit, list(-seq(3)), sum, fill = NA))
}


result <- sumCrit(my.data)

head(result, 7)
## A tibble: 7 x 4
## Groups:   category [1]
#  category date       critical ncrit
#  <fct>    <date>     <fct>    <int>
#1 A        2018-08-14 yes         NA
#2 A        2018-08-15 no          NA
#3 A        2018-08-16 yes         NA
#4 A        2018-08-17 no           2
#5 A        2018-08-18 yes          1
#6 A        2018-08-19 no           2
#7 A        2018-08-20 yes          1

数据。

这是一个组成的数据集,用于测试上面的代码。

set.seed(3635)    # Make the results reproducible
my.data <- data.frame(category = rep(c("A", "B"), each = 10),
                      date = rep(seq(Sys.Date() - 9, Sys.Date(), by = "days"), 2),
                      critical = sample(c("no", "yes"), 20, TRUE))

答案 1 :(得分:0)

数据生成

DATE1 <- as.Date("2018-08-23")
DATE2 <- as.Date("2018-07-23")

# creating a data range with the start and end date:
dates <- seq(DATE2, DATE1, by="days")

dt<-data.frame(category=sample(1:6,32,replace = T),deadline=dates)

过滤日期

library("tidyverse")
dt %>% 
  group_by(category) %>% 
  filter(deadline %in% seq(Sys.Date()-7,Sys.Date() , by="days") )

答案 2 :(得分:0)

使用Rui Barradas创建的数据集,使用间隔提供润滑的配方

set.seed(3635)    # Make the results reproducible
my.data <- data.frame(category = rep(c("A", "B"), each = 10),
                      date = rep(seq(Sys.Date() - 9, Sys.Date(), by = "days"), 2),
                      critical = sample(c("no", "yes"), 20, TRUE))


library(lubridate) #use lubridate to create intervals
 INT_check<-interval(Sys.Date()-7,Sys.Date()) # 7 days from today
my.data %>% 
  filter(date %within% INT_check ) %>% 
  group_by(category)%>%
  summarise(ncrit = sum(critical == 'yes'))

您还可以将INT_Check指定为

   INT_check<-interval("2018-08-16","2018-08-18") # if you want to use absolute dates
    INT_check<-interval("2018-08-16",Sys.Date()) # if you want to specify just absolute start date