Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
按R中可用总数据的最后12个月筛选数据_R_Date - Fatal编程技术网

按R中可用总数据的最后12个月筛选数据

按R中可用总数据的最后12个月筛选数据,r,date,R,Date,R: 我有一个数据集,其中N个产品的销售值从某个yyyy-mm-dd到某个yyyy-mm-dd,我只想筛选数据集中每个产品过去12个月的数据 例如: 比如说,我有2016-01-01到2020-02-01的值 所以现在我想过滤过去12个月的销售额,即2019-02-01到2020-02-01 我不能简单地提到“过滤器(月份>=as.Date(“2019-04-01”)&Month,您可以使用: library(dplyr) library(lubridate) data %>% gro

R:

我有一个数据集,其中N个产品的销售值从某个yyyy-mm-dd到某个yyyy-mm-dd,我只想筛选数据集中每个产品过去12个月的数据

例如: 比如说,我有2016-01-01到2020-02-01的值 所以现在我想过滤过去12个月的销售额,即2019-02-01到2020-02-01 我不能简单地提到“过滤器(月份>=as.Date(“2019-04-01”)&Month,您可以使用:

library(dplyr)
library(lubridate)
data %>%
  group_by(Product) %>%
  filter(between(date, max(date) - years(1), max(date)))
  #filter(date >= (max(date) - years(1)) & date <= max(date))
库(dplyr)
图书馆(lubridate)
数据%>%
组别(产品)%>%
过滤器(介于(日期、最长(日期)-年(1)、最长(日期))之间)

#筛选(日期>=(最大(日期)-年(1))&date您可以测试日期是否大于等于每个产品的最大日期减去365天:

library(dplyr)
df %>% 
  group_by(Products) %>% 
  filter(Date >= max(Date)-365)

# A tibble: 6 x 2
# Groups:   Products [3]
  Products Date      
     <dbl> <date>    
1        1 2002-01-21
2        1 2002-02-10
3        2 2002-02-24
4        2 2002-02-10
5        2 2001-07-01
6        3 2005-03-10
库(dplyr)
df%>%
集团(产品)%>%
过滤器(日期>=最大值(日期)-365)
#一个tibble:6x2
#组别:产品[3]
产品日期
1        1 2002-01-21
2        1 2002-02-10
3        2 2002-02-24
4        2 2002-02-10
5        2 2001-07-01
6        3 2005-03-10

资料


df如果您的目标只是捕获从今天到去年同一天的条目,那么:

函数
Sys.Date()
将当前日期作为
Date
类型的对象返回。然后,您可以将其转换为POSIXlc表单,以调整年份以获取开始日期。例如:

end.date <- Sys.Date()
end.date.lt <- asPOSIXlt(end.date)
start.date.lt <- end.date.lt
start.date.lt$year <- start.date.lt$year - 1
start.date <- asPOSIXct(start.date.lt)
end.date输入:

代码:


这就是你要找的吗?

谢谢Ronak。对于那些想这样做几个月的人,你可能会遇到NA问题。1月31日+1个月=2月28日还是3月3日?看看这个,使用lubridate的
%m-%
来帮助。例如
过滤器(介于(日期,最大(日期)$m-$months(1),最大(日期))
end.date <- Sys.Date()
end.date.lt <- asPOSIXlt(end.date)
start.date.lt <- end.date.lt
start.date.lt$year <- start.date.lt$year - 1
start.date <- asPOSIXct(start.date.lt)
   product       date
 1:       a 2017-01-01
 2:       b 2017-04-01
 3:       a 2017-07-01
 4:       b 2017-10-01
 5:       a 2018-01-01
 6:       b 2018-04-01
 7:       a 2018-07-01
 8:       b 2018-10-01
 9:       a 2019-01-01
10:       b 2019-04-01
11:       a 2019-07-01
12:       b 2019-10-01
library(lubridate)
library(data.table)

DT <- data.table(
  product = rep(c("a", "b"), 6),
  date = seq(as.Date("2017-01-01"), as.Date("2019-12-31"), by = "quarter")
)

yearBefore <- function(x){
  year(x) <- year(x) - 1
  x
}

date_DT <- DT[, .(last_date = last(date)), by = product]
date_DT[, year_before := yearBefore(last_date)]
result <- DT[, date_DT[DT, on = .(product, year_before <= date), nomatch=0]]
result[, last_date := NULL]
setnames(result, "year_before", "date")
   product       date
1:       a 2018-07-01
2:       b 2018-10-01
3:       a 2019-01-01
4:       b 2019-04-01
5:       a 2019-07-01
6:       b 2019-10-01