循环遍历列名计算tibble滚动相关系数时的变量传递问题
解决tibble中动态列名计算滚动相关系数的问题
你遇到的问题核心是tq_mutate_xy默认使用非标准求值(NSE),它期望直接引用列名而非通过变量传递。下面给你两种实用的解决方案:
方案1:用tidyeval动态传递单个列对
通过rlang包的sym()和!!操作符,把字符串变量转换成列名引用,注入到函数中:
library(tidyquant) library(tibble) library(rlang) # 通常tidyquant会自动加载,手动导入更稳妥 # 构造测试数据 tbl <- tibble(date = seq(as.Date("1983-03-31"), by=7, length.out=100), col1 = 1:100, col2 = sample(100, size = 100, replace=TRUE), col3 = col1 + col2) # 定义要计算的列名变量 x_col <- "col1" y_col <- "col3" # 动态注入列名计算滚动相关 tbl %>% tq_mutate_xy( x = !!sym(x_col), # 把字符串转成列引用并注入 y = !!sym(y_col), mutate_fun = runCor, n = 10, use = "pairwise.complete.obs", col_rename = paste0(x_col, "_", y_col, "_corr") # 动态生成结果列名 )
方案2:循环计算多组列对的滚动相关
如果需要批量计算多组列的滚动相关(比如col1和其他所有列),可以结合purrr的循环函数实现:
library(purrr) # 定义要和col1配对的目标列(排除date和col1本身) target_cols <- setdiff(names(tbl), c("date", "col1")) # 循环计算并合并结果 final_tbl <- tbl %>% select(date, col1) %>% bind_cols( map_dfc(target_cols, function(y_col) { tbl %>% tq_mutate_xy( x = col1, y = !!sym(y_col), mutate_fun = runCor, n = 10, use = "pairwise.complete.obs" ) %>% select(-date, -col1) %>% set_names(paste0("col1_", y_col, "_corr")) }) ) # 查看结果 head(final_tbl)
原理说明
sym(x_col):把字符串格式的列名转换成R能识别的符号对象(即列引用)!!:称为“解引用操作符”,它告诉tq_mutate_xy:不要把sym(x_col)当作变量名,而是直接使用它指向的列
内容的提问来源于stack exchange,提问作者rinspy
相关产品推荐
相关产品推荐

