Использование интервалов для определения, находится ли столбец дат в векторе других дат - PullRequest
2 голосов
/ 10 ноября 2019

Я пытался взять вектор дат (даты рецессии), создать интервал, а затем использовать этот интервал, чтобы создать новый столбец в существующем фрейме данных, указывающий, попала ли дата в период рецессии.

Я уверен, что есть несколько способов сделать это, но способ, которым я пытался, не сработал, и я не знал, как это исправить. Я пытался использовать этот подход , но безрезультатно.

Воспроизводимый пример

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 Ответ

2 голосов
/ 10 ноября 2019

Глядя на файл справки, который вы связали, вы должны убедиться, что интервалы в list для их правильного сравнения.

переработано в соответствии со стандартными правилами R. Если b - это список интервалов, a проверяется, попадает ли он в какой-либо из интервалов в b.

Следовательно, это должно работать:

my_df %>% mutate(recession = Date %within% as.list(recession_intervals))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...