[英]Is there a way in r to check if each date of a list of dates is within a list of intervals?
我有某個股票代碼的時間序列。 我還有一個數據框,其中 2 列代表衰退的開始和結束日期。 我需要創建一個列表來表示股票時間序列的每一天是否處於衰退 (1) 或不處於衰退 (0)。 更詳細地說,我的表如下所示:
structure(list(Peak = structure(c(-20819, -18781, -18263, -17047,
-15798, -14763, -11933, -9100, -7731, -6028, -4536, -3562, -31,
1400, 3652, 4199, 7486, 11382, 13848, 18293), class = "Date"),
Trough = structure(c(-20120, -18569, -17716, -16620, -15402,
-13455, -11537, -8858, -7397, -5724, -4293, -3256, 304, 1885,
3834, 4687, 7729, 11627, 14396, 18504), class = "Date")), row.names = 4:23, class = "data.frame")
我試過:
getSymbols('NFCI', src = 'FRED')
time(NFCI) %within% interval(recessions$Peak,recessions$Trough)
但我沒有得到正確的答案,我也收到了警告
較長的物體長度不是較短物體長度的倍數
我可以做一個循環並檢查每一行,但認為可能有更簡單的方法。 提前致謝!
編輯:顯然,我確實得到了正確的答案,但我手動對其進行了錯誤的測試,這就是為什么我認為答案是錯誤的。 感謝@FernandoBarbosa 和@RuiBarradas 讓我注意到它。
訣竅是將interval
對象強制為"list"
類。 請參閱help(``%within%``)
的最后一個示例。
library(lubridate)
library(quantmod)
aapl <- getSymbols("AAPL", auto.assign = FALSE)
time(aapl) %within% as.list(interval(recessions$Peak, recessions$Trough))
此編輯旨在回答以下評論。
interval
調用的輸出是
interval(recessions$Peak, recessions$Trough)
# [1] 1913-01-01 UTC--1914-12-01 UTC 1918-08-01 UTC--1919-03-01 UTC
# [3] 1920-01-01 UTC--1921-07-01 UTC 1923-05-01 UTC--1924-07-01 UTC
# [5] 1926-10-01 UTC--1927-11-01 UTC 1929-08-01 UTC--1933-03-01 UTC
# [7] 1937-05-01 UTC--1938-06-01 UTC 1945-02-01 UTC--1945-10-01 UTC
# [9] 1948-11-01 UTC--1949-10-01 UTC 1953-07-01 UTC--1954-05-01 UTC
#[11] 1957-08-01 UTC--1958-04-01 UTC 1960-04-01 UTC--1961-02-01 UTC
#[13] 1969-12-01 UTC--1970-11-01 UTC 1973-11-01 UTC--1975-03-01 UTC
#[15] 1980-01-01 UTC--1980-07-01 UTC 1981-07-01 UTC--1982-11-01 UTC
#[17] 1990-07-01 UTC--1991-03-01 UTC 2001-03-01 UTC--2001-11-01 UTC
#[19] 2007-12-01 UTC--2009-06-01 UTC 2020-02-01 UTC--2020-08-30 UTC
作為一個列表,它變成
as.list(interval(recessions$Peak, recessions$Trough))
#[[1]]
#[1] 1913-01-01 UTC--1914-12-01 UTC
#
#[[2]]
#[1] 1918-08-01 UTC--1919-03-01 UTC
#
#[[3]]
#[1] 1920-01-01 UTC--1921-07-01 UTC
#
#[[4]]
#[1] 1923-05-01 UTC--1924-07-01 UTC
#
#[[5]]
#[1] 1926-10-01 UTC--1927-11-01 UTC
#
#[[6]]
#[1] 1929-08-01 UTC--1933-03-01 UTC
#
#[[7]]
#[1] 1937-05-01 UTC--1938-06-01 UTC
#
#[[8]]
#[1] 1945-02-01 UTC--1945-10-01 UTC
#
#[[9]]
#[1] 1948-11-01 UTC--1949-10-01 UTC
#
#[[10]]
#[1] 1953-07-01 UTC--1954-05-01 UTC
#
#[[11]]
#[1] 1957-08-01 UTC--1958-04-01 UTC
#
#[[12]]
#[1] 1960-04-01 UTC--1961-02-01 UTC
#
#[[13]]
#[1] 1969-12-01 UTC--1970-11-01 UTC
#
#[[14]]
#[1] 1973-11-01 UTC--1975-03-01 UTC
#
#[[15]]
#[1] 1980-01-01 UTC--1980-07-01 UTC
#
#[[16]]
#[1] 1981-07-01 UTC--1982-11-01 UTC
#
#[[17]]
#[1] 1990-07-01 UTC--1991-03-01 UTC
#
#[[18]]
#[1] 2001-03-01 UTC--2001-11-01 UTC
#
#[[19]]
#[1] 2007-12-01 UTC--2009-06-01 UTC
#
#[[20]]
#[1] 2020-02-01 UTC--2020-08-30 UTC
后面的返回值中有 522 個TRUE
值:
in_recess <- time(aapl) %within% as.list(interval(recessions$Peak, recessions$Trough))
sum(in_recess)
#[1] 522
正如 Rui 所說,“as.list”應該可以解決您的問題。 代碼是:
library(lubridate)
library(quantmod)
getSymbols('NFCI', src = 'FRED')
time(NFCI) %within% as.list(interval(recessions$Peak,recessions$Trough))
如果你想把假人移到 NFCI,你可以這樣做:
NFCI$isRecession <- time(NFCI) %within% as.list(interval(recessions$Peak,recessions$Trough))
附錄:我為重現您的數據而編寫的完整代碼。 它運行正常。
library(quantmod)
library(lubridate)
peak = c(-20819, -18781, -18263, -17047,
-15798, -14763, -11933, -9100, -7731, -6028, -4536, -3562, -31,
1400, 3652, 4199, 7486, 11382, 13848, 18293)
trough = c(-20120, -18569, -17716, -16620, -15402,
-13455, -11537, -8858, -7397, -5724, -4293, -3256, 304, 1885,
3834, 4687, 7729, 11627, 14396, 18504)
recessions <- data.frame(Peak=as.Date(peak),
Trough=as.Date(trough)
)
getSymbols('NFCI', src = 'FRED')
time(NFCI) %within% as.list(interval(recessions$Peak,recessions$Trough))
NFCI$isRecession <- time(NFCI) %within% as.list(interval(recessions$Peak,recessions$Trough))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.