Отфильтровать данные за последние 12 месяцев из всех данных, доступных в R - PullRequest
1 голос
/ 19 июня 2020

R:

У меня есть набор данных со стоимостью продаж N продуктов от некоторого yyyy-mm-dd до некоторого yyyy-mm-dd, я просто хочу отфильтровать данные за последние 12 месяцев для каждый продукт в наборе данных.

Например: Скажем, у меня есть значения с 01.01.2016 по 01.02.2020. Теперь я хочу отфильтровать значения продаж за последние 12 месяцев, которые от С 01.02.2019 по 01.02.2020 Я просто не могу просто упомянуть "фильтр (Месяц> = as.Date (" 2019-04-01 ") & Month <= as.Date (" 2020-04-01 ") )) "потому что дата окончания для моего дела постоянно меняется с каждым месяцем, поэтому мне нужно автоматизировать дело. </p>

Ответы [ 4 ]

1 голос
/ 19 июня 2020

Вы можете использовать:

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))
0 голосов
/ 19 июня 2020

Ввод:

   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

Это то, что вы ищете?

0 голосов
/ 19 июня 2020

Если ваша цель - просто захватить записи с сегодняшнего дня до того же дня в прошлом году, тогда:

Функция Sys.Date() возвращает текущую дату как объект типа Date. Затем вы можете преобразовать это в форму POSIXl c, чтобы настроить год и получить дату начала. Например:

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)

Теперь у этого есть одно потенциальное состояние отказа: если сегодня 29 февраля. Один из способов справиться с этим - написать функцию «today.last.year» для выполнения вышеуказанного преобразования, но с явным указанием високосных лет - возможно, включая возможность считать «сегодня в прошлом году» как 28 февраля или 1 марта, в зависимости от того, что дает вам желаемое поведение.

В качестве альтернативы, если вы хотите отфильтровать по дате начала месяца, вы можете установить для своей функции также start.date.lt$day = 1 и т. Д., Если настраивать нужно по-разному.

0 голосов
/ 19 июня 2020

Вы можете проверить, больше ли дата равна максимальной дате для каждого продукта минус 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

Data

df <- data.frame(
  Products = c(1,1,1,1,2,2,2,3,3,3), 
  Date = as.Date(c("2000-02-01", "2002-01-21", "2002-02-10", 
                   "2000-06-01", "2002-02-24", "2002-02-10",
                   "2001-07-01", "2003-01-02", "2005-03-10",
                   "2002-05-01")))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...