使用间隔来识别日期列是否在其他日期的向量内

时间:2019-11-09 23:36:13

标签: r dplyr intervals lubridate

我试图获取日期(衰退日期)的向量,创建一个间隔,然后使用该间隔在现有数据框中创建一个新列,以指示某个日期是否在衰退期内。

我确定有多种方法可以执行此操作,但是我尝试的方法没有用,并且不确定如何解决。我试图使用this approach,但无济于事。

可复制示例

library(tidyverse)
library(lubridate)


# dput data
recession_dates <- structure(list(start = structure(c(4199, 7486, 11382, 13848), class = "Date"), 
                           stop = structure(c(4687, 7729, 11627, 14396), class = "Date")), class = c("tbl_df", 
                                                                                                     "tbl", "data.frame"), row.names = c(NA, -4L))


my_df <- structure(list(Date = structure(c(3742, 3833, 3925, 4017, 4107, 
                                             4198, 4290, 4382, 4472, 4563, 4655, 4747, 4837, 4928, 5020, 5112, 
                                             5203, 5294, 5386, 5478, 5568, 5659, 5751, 5843, 5933, 6024, 6116, 
                                             6208, 6298, 6389, 6481, 6573, 6664, 6755, 6847, 6939, 7029, 7120, 
                                             7212, 7304, 7394, 7485, 7577, 7669, 7759, 7850, 7942, 8034, 8125, 
                                             8216, 8308, 8400, 8490, 8581, 8673, 8765, 8855, 8946, 9038, 9130, 
                                             9220, 9311, 9403, 9495, 9586, 9677, 9769, 9861, 9951, 10042, 
                                             10134, 10226, 10316, 10407, 10499, 10591, 10681, 10772, 10864, 
                                             10956, 11047, 11138, 11230, 11322, 11412, 11503, 11595, 11687, 
                                             11777, 11868, 11960, 12052, 12142, 12233, 12325, 12417, 12508, 
                                             12599, 12691, 12783, 12873, 12964, 13056, 13148, 13238, 13329, 
                                             13421, 13513, 13603, 13694, 13786, 13878, 13969, 14060, 14152, 
                                             14244, 14334, 14425, 14517, 14609, 14699, 14790, 14882, 14974, 
                                             15064, 15155, 15247, 15339, 15430, 15521, 15613, 15705, 15795, 
                                             15886, 15978, 16070, 16160, 16251, 16343, 16435, 16525, 16616, 
                                             16708, 16800, 16891, 16982, 17074, 17166, 17256, 17347, 17439, 
                                             17531, 17621, 17712, 17804, 17896, 17986, 18077, 18169), class = "Date"), 
                          Asset = c("real_gdp_usd2012", "real_gdp_usd2012", "real_gdp_usd2012", 
                                    "real_gdp_usd2012", "real_gdp_usd2012", "real_gdp_usd2012", 
                                    "real_gdp_usd2012", "real_gdp_usd2012", "real_gdp_usd2012", 
                                    "real_gdp_usd2012", "real_gdp_usd2012", "real_gdp_usd2012", 
                                    "real_gdp_usd2012", "real_gdp_usd2012", "real_gdp_usd2012", 
                                    "real_gdp_usd2012", "real_gdp_usd2012", "real_gdp_usd2012", 
                                    "real_gdp_usd2012", "real_gdp_usd2012", "real_gdp_usd2012", 
                                    "real_gdp_usd2012", "real_gdp_usd2012", "real_gdp_usd2012", 
                                    "real_gdp_usd2012", "real_gdp_usd2012", "real_gdp_usd2012", 
                                    "real_gdp_usd2012", "real_gdp_usd2012", "real_gdp_usd2012", 
                                    "real_gdp_usd2012", "real_gdp_usd2012", "real_gdp_usd2012", 
                                    "real_gdp_usd2012", "real_gdp_usd2012", "real_gdp_usd2012", 
                                    "real_gdp_usd2012", "real_gdp_usd2012", "real_gdp_usd2012", 
                                    "real_gdp_usd2012", "real_gdp_usd2012", "real_gdp_usd2012", 
                                    "real_gdp_usd2012", "real_gdp_usd2012", "real_gdp_usd2012", 
                                    "real_gdp_usd2012", "real_gdp_usd2012", "real_gdp_usd2012", 
                                    "real_gdp_usd2012", "real_gdp_usd2012", "real_gdp_usd2012", 
                                    "real_gdp_usd2012", "real_gdp_usd2012", "real_gdp_usd2012", 
                                    "real_gdp_usd2012", "real_gdp_usd2012", "real_gdp_usd2012", 
                                    "real_gdp_usd2012", "real_gdp_usd2012", "real_gdp_usd2012", 
                                    "real_gdp_usd2012", "real_gdp_usd2012", "real_gdp_usd2012", 
                                    "real_gdp_usd2012", "real_gdp_usd2012", "real_gdp_usd2012", 
                                    "real_gdp_usd2012", "real_gdp_usd2012", "real_gdp_usd2012", 
                                    "real_gdp_usd2012", "real_gdp_usd2012", "real_gdp_usd2012", 
                                    "real_gdp_usd2012", "real_gdp_usd2012", "real_gdp_usd2012", 
                                    "real_gdp_usd2012", "real_gdp_usd2012", "real_gdp_usd2012", 
                                    "real_gdp_usd2012", "real_gdp_usd2012", "real_gdp_usd2012", 
                                    "real_gdp_usd2012", "real_gdp_usd2012", "real_gdp_usd2012", 
                                    "real_gdp_usd2012", "real_gdp_usd2012", "real_gdp_usd2012", 
                                    "real_gdp_usd2012", "real_gdp_usd2012", "real_gdp_usd2012", 
                                    "real_gdp_usd2012", "real_gdp_usd2012", "real_gdp_usd2012", 
                                    "real_gdp_usd2012", "real_gdp_usd2012", "real_gdp_usd2012", 
                                    "real_gdp_usd2012", "real_gdp_usd2012", "real_gdp_usd2012", 
                                    "real_gdp_usd2012", "real_gdp_usd2012", "real_gdp_usd2012", 
                                    "real_gdp_usd2012", "real_gdp_usd2012", "real_gdp_usd2012", 
                                    "real_gdp_usd2012", "real_gdp_usd2012", "real_gdp_usd2012", 
                                    "real_gdp_usd2012", "real_gdp_usd2012", "real_gdp_usd2012", 
                                    "real_gdp_usd2012", "real_gdp_usd2012", "real_gdp_usd2012", 
                                    "real_gdp_usd2012", "real_gdp_usd2012", "real_gdp_usd2012", 
                                    "real_gdp_usd2012", "real_gdp_usd2012", "real_gdp_usd2012", 
                                    "real_gdp_usd2012", "real_gdp_usd2012", "real_gdp_usd2012", 
                                    "real_gdp_usd2012", "real_gdp_usd2012", "real_gdp_usd2012", 
                                    "real_gdp_usd2012", "real_gdp_usd2012", "real_gdp_usd2012", 
                                    "real_gdp_usd2012", "real_gdp_usd2012", "real_gdp_usd2012", 
                                    "real_gdp_usd2012", "real_gdp_usd2012", "real_gdp_usd2012", 
                                    "real_gdp_usd2012", "real_gdp_usd2012", "real_gdp_usd2012", 
                                    "real_gdp_usd2012", "real_gdp_usd2012", "real_gdp_usd2012", 
                                    "real_gdp_usd2012", "real_gdp_usd2012", "real_gdp_usd2012", 
                                    "real_gdp_usd2012", "real_gdp_usd2012", "real_gdp_usd2012", 
                                    "real_gdp_usd2012", "real_gdp_usd2012", "real_gdp_usd2012", 
                                    "real_gdp_usd2012", "real_gdp_usd2012", "real_gdp_usd2012", 
                                    "real_gdp_usd2012", "real_gdp_usd2012", "real_gdp_usd2012", 
                                    "real_gdp_usd2012", "real_gdp_usd2012", "real_gdp_usd2012"
                          ), Value = c(6837.6, 6696.8, 6688.8, 6813.5, 6947, 6895.6, 
                                       6978.1, 6902.1, 6794.9, 6825.9, 6799.8, 6802.5, 6892.1, 7049, 
                                       7189.9, 7339.9, 7483.4, 7612.7, 7686.1, 7749.2, 7824.2, 7893.1, 
                                       8013.7, 8073.2, 8148.6, 8185.3, 8263.6, 8308, 8369.9, 8460.2, 
                                       8533.6, 8680.2, 8725, 8839.6, 8891.4, 9009.9, 9101.5, 9171, 
                                       9238.9, 9257.1, 9358.3, 9392.3, 9398.5, 9312.9, 9269.4, 9341.6, 
                                       9388.8, 9421.6, 9534.3, 9637.7, 9733, 9834.5, 9851, 9908.3, 
                                       9955.6, 10091, 10189, 10327, 10387.4, 10506.4, 10543.6, 10575.1, 
                                       10665.1, 10737.5, 10817.9, 10998.3, 11097, 11212.2, 11284.6, 
                                       11472.1, 11615.6, 11715.4, 11832.5, 11942, 12091.6, 12287, 
                                       12403.3, 12498.7, 12662.4, 12877.6, 12924.2, 13160.8, 13178.4, 
                                       13260.5, 13222.7, 13300, 13244.8, 13280.9, 13397, 13478.2, 
                                       13538.1, 13559, 13634.3, 13751.5, 13985.1, 14145.6, 14221.1, 
                                       14329.5, 14465, 14609.9, 14771.6, 14839.8, 14972.1, 15066.6, 
                                       15267, 15302.7, 15326.4, 15456.9, 15493.3, 15582.1, 15666.7, 
                                       15762, 15671.4, 15752.3, 15667, 15328, 15155.9, 15134.1, 
                                       15189.2, 15356.1, 15415.1, 15557.3, 15672, 15750.6, 15712.8, 
                                       15825.1, 15820.7, 16004.1, 16129.4, 16198.8, 16220.7, 16239.1, 
                                       16383, 16403.2, 16531.7, 16663.6, 16616.5, 16841.5, 17047.1, 
                                       17143, 17277.6, 17405.7, 17463.2, 17468.9, 17556.8, 17639.4, 
                                       17735.1, 17824.2, 17925.3, 18021, 18163.6, 18322.5, 18438.3, 
                                       18598.1, 18732.7, 18783.5, 18927.3, 19021.9, 19112.5)), row.names = c(NA, 
                                                                                                             -159L), class = "data.frame")




# Turn recession dates into recession intervals
recession_intervals <- interval(recession_dates$start, recession_dates$stop)

# Test to see if works
my_df %>% mutate(recession = Date %within% recession_intervals)

不起作用:

   # partial output
> my_df %>% mutate(recession = Date %within% recession_intervals)
          Date            Asset   Value recession
1   1980-03-31 real_gdp_usd2012  6837.6     FALSE
2   1980-06-30 real_gdp_usd2012  6696.8     FALSE
3   1980-09-30 real_gdp_usd2012  6688.8     FALSE
4   1980-12-31 real_gdp_usd2012  6813.5     FALSE
5   1981-03-31 real_gdp_usd2012  6947.0     FALSE
6   1981-06-30 real_gdp_usd2012  6895.6     FALSE
7   1981-09-30 real_gdp_usd2012  6978.1     FALSE
8   1981-12-31 real_gdp_usd2012  6902.1     FALSE
9   1982-03-31 real_gdp_usd2012  6794.9      TRUE
10  1982-06-30 real_gdp_usd2012  6825.9     FALSE
11  1982-09-30 real_gdp_usd2012  6799.8     FALSE
12  1982-12-31 real_gdp_usd2012  6802.5     FALSE
13  1983-03-31 real_gdp_usd2012  6892.1     FALSE

但是,这不起作用,因为在经济衰退期内,输出在任何日期都不会返回TRUE(还会生成很多警告消息)。

如果有人可以告诉我使用此方法的正确方法(也可以使用dplyr使用其他可扩展方法),我将不胜感激!

戴夫

1 个答案:

答案 0 :(得分:2)

在查看链接的帮助文件时,需要确保间隔在list中,以便正确比较它们。

  

根据标准R规则回收。 如果b是间隔列表,则a   检查它是否落在b中的任何间隔内。

因此,这应该起作用:

my_df %>% mutate(recession = Date %within% as.list(recession_intervals))