R语言中如何用direction变量存储汇率走势值并修正列取值错误
问题原因
你代码的核心错误是做逻辑比较时用了整个数据框对象a参与运算:
historical_exchange_rates()返回的a是包含两列的数据框:第一列为日期类型的date列,第二列才是你需要的THB兑USD汇率值- 当你直接写
a > Lag(a[,2],10)时,R会将数据框的所有列(包括第一列日期)依次和滞后汇率值做比较,日期和数值的比较会产生无意义的逻辑结果,最终赋值时就会错误匹配第一列的判断结果 - 初始赋值用
NULL创建空对象再按索引赋值的写法,也容易出现长度不匹配、索引错位的问题
修正代码
library(priceR) # 拉取汇率数据 a <- historical_exchange_rates("THB", to = "USD", start_date = "2010-01-01", end_date = "2021-12-31") # 明确提取第二列汇率为向量,避免数据框属性导致的列匹配错误 rate <- a[[2]] # 计算10期滞后汇率 lag10_rate <- Lag(rate, 10) # 初始化等长的方向变量,默认填充NA(对应前10行无滞后值的情况) a.direction <- rep(NA, length(rate)) # 仅对有效滞后值的行做判断赋值 a.direction[rate > lag10_rate & !is.na(lag10_rate)] <- 1 a.direction[rate < lag10_rate & !is.na(lag10_rate)] <- 0 # 更稳妥的写法:直接在原数据框新增列,行级一一对应完全不会错位 a$direction <- ifelse( rate > lag10_rate, 1, ifelse(rate < lag10_rate, 0, NA) # 汇率和滞后值相等的情况默认赋值NA,可按需调整 )
关键调整点
- 逻辑比较时不再使用整个数据框
a,而是明确提取第二列的汇率向量参与运算,从根源上避免第一列日期被错误纳入判断 - 提前将汇率、10期滞后汇率存为独立向量,避免重复调用函数时出现索引错位
- 初始化
a.direction时直接创建和数据等长的向量,替代原来的NULL空对象,避免赋值时长度不匹配 - 显式排除滞后计算产生的前10行NA值,避免逻辑判断出现意外结果
- 推荐直接在原数据框中新增方向列的写法,所有变量按行绑定,完全不会出现跨列匹配错误
注意:
Lag()函数来自quantmod/dplyr等扩展包,如果未加载相关包会报错,使用常规data.frame计算时,调用dplyr::lag(rate, n=10)计算滞后值兼容性更好。
内容的提问来源于stack exchange,提问作者Napat Viseshsin
相关产品推荐
相关产品推荐

