我有一个关于在R中过滤日期的问题。我找到了这个链接dplyr过滤器启用日期筛选器,它回答了如何在特定日期范围内借助dplyr进行过滤的问题。我想选择一个动态范围,例如计算特定窗口中的关键作业数,例如从数据集中当前日期开始的最近七天。我脑海中的代码应该是这样的:
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数据(Rui Barradas):
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))发布于 2018-08-23 14:41:08
没有示例数据集就不容易说,但根据您对问题的描述,我相信以下内容是正确的。
代码使用函数rollapplyr来自包zoo,灵感不是来自于被接受的,而是来自于对以下问题的第二个答案此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
#
#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))发布于 2018-08-23 14:38:39
数据生成
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") )发布于 2018-08-23 15:03:35
使用Rui Barradas创建的数据集,提供lubridate公式,使用intervals
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_检查为
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 datehttps://stackoverflow.com/questions/51979378
复制相似问题