【问题标题】:How can I filter on a past date given another date in a specific row of data.frame?给定data.frame的特定行中的另一个日期,如何过滤过去的日期?
【发布时间】:2019-01-29 10:53:56
【问题描述】:

我有一个关于过滤 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))

【问题讨论】:

  • 请包含my.data 的示例数据。 date 列中的条目是否为日期对象(例如 POSIXct)?还要解释为什么代码不能正常运行。有错误吗?警告?结果不是预期的结果吗?
  • 请注意date &gt; date - days(7)date &lt;= date 始终为TRUE
  • 您现在是否对"no" 的值求和?如果是这样,第 3 行不应该是 1 吗?
  • 我将这些值相加“是”。在第 4 行(2018-08-17),我对第 14、15、16 天(2 次是)进行了总结。在第 3 行中,我添加了 NA,因为我希望正好有三天可用,但你是对的,可以将其更改为 1。
  • @Ollinator 看看对答案的编辑是否解决了它。

标签: r dplyr


【解决方案1】:

如果没有示例数据集,这很难说,但鉴于您对问题的描述,我相信以下内容是正确的。
该代码使用来自包zoo 的函数rollapplyr,其灵感不是来自于接受,而是来自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))

【讨论】:

    【解决方案2】:

    数据生成

    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") )
    

    【讨论】:

      【解决方案3】:

      使用 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-04-25
        • 2023-03-09
        • 1970-01-01
        • 2011-04-14
        • 1970-01-01
        • 1970-01-01
        • 2020-03-25
        • 2014-06-07
        相关资源
        最近更新 更多