Xts допускает естественные запросы времени на основе диапазона, подобные этому willsh["1979-12-31/2017-12-31"]

Есть ли в tidyverse что-то подобное?

0
Yakov-vc 10 Июл 2021 в 13:44

3 ответа

Лучший ответ

Lubridate имеет класс интервала. Любой из них может использоваться для представления интервала с 31 декабря 1979 года по 31 декабря 2017 года.

library(dplyr)
library(lubridate)

ival1 <- interval("19791231/20171231")
ival1a <- interval("1979-12-31/2017-12-31") 
ival2 <- interval("19791231/P38Y")
ival2a <- interval("1979-12-31/P38Y")
ival3 <- interval(ymd(19791231), ymd(20171231))
ival3a <- interval(ymd("1979-12-31"), ymd("2017-12-31"))

sapply(list(ival1, ival1a, ival2, ival2a, ival3, ival3a), identical, ival1)
## [1] TRUE TRUE TRUE TRUE TRUE TRUE

%within% можно использовать для проверки того, попадает ли дата в интервал.

ymd(c(19791230, 19791231, 19800101, 20171230, 20171231, 20180101)) %within% ival1
## [1] FALSE  TRUE  TRUE  TRUE  TRUE FALSE

Мы можем использовать это так:

# test input
willsh <- tibble(Date = seq(ymd(19700101), ymd(20210101), by = "10 year"), 
             year = year(Date))

willsh %>% filter(Date %within% interval("1979-12-31/2017-12-31"))
## # A tibble: 4 x 2
##   Date        year
##   <date>     <dbl>
## 1 1980-01-01  1980
## 2 1990-01-01  1990
## 3 2000-01-01  2000
## 4 2010-01-01  2010
0
G. Grothendieck 10 Июл 2021 в 15:42

Нет dplyr или tidyverse не имеют такого синтаксиса. Вы можете использовать filter как

library(dplyr)

willsh %>% 
   filter(Date >= as.Date("1979-12-31"), Date <= as.Date("2017-12-31"))

Или используйте between:

willsh %>%
  filter(between(Date, as.Date("1979-12-31"), as.Date("2017-12-31")))
1
Ronak Shah 10 Июл 2021 в 11:13

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

library(data.table)
setDT(willsh)[between(Date, as.IDate("1979-12-31"), as.IDate("2017-12-31"))]
0
akrun 10 Июл 2021 в 19:14