簡體   English   中英

在 r 中有沒有辦法檢查日期列表的每個日期是否在間隔列表內?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM