如何在dplyr::across的嵌套函数中传递变量计算滚动相关性
错误原因
你的代码写法存在逻辑问题:tibbletime::rollify() 的作用是把普通函数转换为支持滚动窗口计算的函数,它的入参需要是待转换的函数本身,你直接在rollify()的括号内执行cor(get("a"),.x),会导致两个问题:
- 还没进入滚动计算逻辑就提前执行了
cor调用,触发变量查找错误 rollify()收到的是cor的返回值而非待转换的函数,所以会报「必须是向量,不是函数」的错误
解决方法
先通过rollify()定义双输入的滚动相关函数,再在dplyr::across()中传入固定列a和当前遍历列即可,正确代码如下:
library(dplyr) library(tibbletime) # 构造测试数据 df <- tibble( a = runif(1000, min=-2, max=2), b = runif(1000, min=-2, max=2), c = runif(1000, min=-2, max=2), d = runif(1000, min=-2, max=2) ) # 定义窗口为100的双变量滚动相关函数 roll_cor <- rollify(function(x, y) cor(x, y), window = 100) # 批量计算c、d列和a列的滚动相关系数 df <- df %>% mutate(across( .cols = c(c, d), .fns = ~roll_cor(.data$a, .x), .names = "{col}_corr" ))
注意事项
- 用
.data$a取当前数据框的a列,比get("a")更安全,不会出现环境变量查找冲突的问题 - 计算得到的
c_corr、d_corr列前99行为NA,从第100行开始有有效结果,符合滚动窗口的计算规则 - 如果不想提前定义
roll_cor,也可以直接把函数写在across中,写法如下:
df %>% mutate(across( .cols = c(c,d), .fns = ~rollify(function(x,y) cor(x,y), window = 100)(.data$a, .x), .names = "{col}_corr" ))
内容的提问来源于stack exchange,提问作者Christian
相关产品推荐
相关产品推荐

