如何在R中根据bondyieldTF判断RecessionTF后续观测以验证衰退指示正确性
解决dplyr中向量条件判断报错及滚动窗口衰退指示验证问题
错误原因
你使用的普通if()是标量判断函数,仅能处理单个值,但bondyieldTF是整列的向量(长度大于1),因此触发the condition has length>1错误。在dplyr管道中必须使用向量化的条件函数(如if_else()、case_when()),同时还要实现"当前及后续4行"的滚动窗口判断逻辑。
解决方案
方法1:使用slider包(推荐,灵活处理滚动窗口)
先安装并加载依赖包,再通过滚动窗口检查衰退存在性,最后判断指示是否正确:
library(dplyr) library(slider) EconFrame <- EconFrame %>% mutate( # 滚动检查当前行+后续4行的RecessionTF是否存在至少一个TRUE has_recession = slide_lgl(RecessionTF, ~any(.x), .before = 0, .after = 4), # 根据bondyieldTF状态判断指示正确性 Indication = case_when( bondyieldTF ~ if_else(has_recession, "Correct", "Incorrect"), TRUE ~ NA_character_ # bondyieldTF为FALSE时标记为NA,可按需调整 ) )
方法2:手动用lead函数组合(无需额外包)
如果不想安装slider包,可通过lead()函数手动拼接当前及后续4行的衰退状态:
library(dplyr) EconFrame <- EconFrame %>% mutate( # 组合当前行与后4行的RecessionTF,判断是否存在TRUE has_recession = RecessionTF | lead(RecessionTF, 1) | lead(RecessionTF, 2) | lead(RecessionTF, 3) | lead(RecessionTF, 4), # 判断指示正确性 Indication = case_when( bondyieldTF ~ if_else(has_recession, "Correct", "Incorrect"), TRUE ~ NA_character_ ) )
示例数据验证结果
针对你提供的示例数据,处理后Indication列结果如下:
| bondyieldTF | RecessionTF | Indication |
|---|---|---|
| TRUE | FALSE | Correct |
| TRUE | FALSE | Correct |
| TRUE | FALSE | Correct |
| TRUE | TRUE | Correct |
| TRUE | TRUE | Correct |
| FALSE | TRUE | NA |
| FALSE | TRUE | NA |
| FALSE | TRUE | NA |
| FALSE | TRUE | NA |
| FALSE | TRUE | NA |
| FALSE | FALSE | NA |
内容的提问来源于stack exchange,提问作者GnarTank
相关产品推荐
相关产品推荐

