根据变化的日期范围自动对R数据框进行子集筛选

4

我有一个R脚本,每月运行一次。我想将数据框子集仅显示6个月时间段内的数据,但每个月我想将时间段向前移动一个月。

9月的原始数据框:

ID  Name  Date
1   John  1/1/2020
2   Adam  5/2/2020
3   Kate  9/30/2020
4   Jill  10/15/2020

在仅保留2020年5月1日到2020年9月30日的日期后进行子集操作:

ID  Name  Date
2   Adam  5/2/2020
3   Kate  9/30/2020

下个月当我运行我的脚本时,我希望它所选取的日期向前移动一个月,因此为2020年6月1日至2020年10月31日。
ID  Name  Date
3   Kate  9/30/2020
4   Jill  10/15/2020

目前,我每个月都手动更改脚本的这一部分,例如:

df$Date >= subset(df$Date >= '2020-05-01' & df$date <= '2020-09-30')

有没有一种自动的方法,让我不必每次手动推迟日期一个月?

你能将实时的 Sys.Date() 函数集成到你的计算中作为动态参考吗?例如,Sys.Date() - 60 表示两个月前。 - SteveM
3个回答

2
我们可以在将“Date”转换为Date类之后使用between
library(dplyr)
library(lubridate)
start <- as.Date("2020-05-01")
end <- as.Date("2020-09-30")

df1 %>%
    mutate(Date = mdy(Date)) %>%
    filter(between(Date, start, end))
#  ID Name       Date
#1  2 Adam 2020-05-02
#2  3 Kate 2020-09-30

在接下来的一个月内,我们可以通过增加1个月来更改“开始”和“结束”时间。
start <- start %m+% months(1)
end <-  ceiling_date(end %m+% months(1), 'months') - days(1)

start
#[1] "2020-06-01"
end
#[1] "2020-10-31"

这仍然意味着我需要手动更改日期为as.Date("2020-06-01", as.Date("2020-10-31")下个月。我想知道是否有避免手动更改月份的方法? - Alice Wang
另一种不错的lubridate方法是 end = floor_date(today(), "months") start = end - months(6) - Joe Erinjeri

2

使用基础的 R,不依赖任何包。

数据:

dt <- read.table(text = 'ID  Name  Date
1   John  1/1/2020
2   Adam  3/2/2021
3   Kate  12/30/2020
4   Jill  5/15/2021', header = TRUE, stringsAsFactors = FALSE)

代码:

date_format <-  "%m/%d/%Y"
dt$Date <- as.Date(dt$Date, format = date_format)
today <- Sys.Date()
six_month <- today+(6*30)
start <- as.Date(paste(format(today, "%m"), "01", 
                       format(today, "%Y"), sep = "/"), 
                 format = date_format)

end <- as.Date(paste(format(six_month, "%m"), "31", 
                     format(six_month, "%Y"), sep = "/"), 
               format = date_format)

dt[with(dt, Date >= start & Date <= end), ]
#   ID Name       Date
# 2  2 Adam 2021-03-02
# 3  3 Kate 2020-12-30
# 4  4 Jill 2021-05-15

0

这是一个非常简单的解决方案:

library(lubridate)

t <- today() #automatic
t <- as.Date('2020-11-26') # manual (you can change it as you like)

start <- floor_date(t %m-% months(6), unit="months")
end   <- floor_date(t %m-% months(1), unit="months")-1

df$Date >= subset(df$Date >= start & df$date <= end)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接