我有一个与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))
答案 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