You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 20:36:00