使用quantmod::Lag函数动态指定列生成滞后数据时的错误问题
解决R中使用变量调用列生成滞后收益的错误问题
我懂你遇到的困扰了——之前直接用df$returns调用列生成1期滞后收益完全正常,但换成变量lookup来指定列时,就触发了x must be a time series or numeric vector的错误。
错误原因分析
你写的paste('df$', lookup)会生成一个字符串"df$returns",而不是实际指向数据框里的returns数值列。Lag()函数需要的是数值向量或时间序列,自然没法处理字符串,所以报错了。
正确的解决方案
这里有两种简单的方法可以解决这个问题:
方法1:使用双括号[[ ]]索引(推荐)
双括号可以直接根据变量名提取数据框里的对应列向量,完美适配Lag()函数的要求:
lookup <- 'returns' df$lag_2 <- Lag(df[[lookup]], k=2)
执行后的数据框会变成:
tickers returns Lag.1 lag_2 1 AAPL 0.10 NA NA 2 AAPL 0.20 0.10 NA 3 AAPL 0.30 0.20 0.10 4 AAPL -0.15 0.30 0.20 5 AAPL -0.25 -0.15 0.30 6 AAPL 0.09 -0.25 -0.15 7 AAPL 0.40 0.09 -0.25 8 AAPL -0.20 0.40 0.09
方法2:使用get()函数
get()可以根据字符串名称提取环境中的对象,这里指定数据框df作为环境,也能拿到目标列:
lookup <- 'returns' df$lag_2 <- Lag(get(lookup, envir = df), k=2)
两种方法都能解决你的问题,不过双括号索引的写法更直观易懂,日常使用更推荐。
内容的提问来源于stack exchange,提问作者equanimity
相关产品推荐
相关产品推荐

