在dplyr::mutate中动态将字符转为列名计算预测与实际值方差
动态在dplyr::mutate中引用列名计算方差
嘿,我懂你想要的效果:根据传入的预测期编码(比如p1),在dplyr的mutate里动态匹配对应的rev_fcast_p*列,然后计算它和实际值act_rev_mtd的方差对吧?下面给你几个实用的实现方法:
方法1:使用.data代词(dplyr 1.0.0+推荐)
.data代词可以让你通过字符串动态引用列名,非常直观且易维护:
先重现你的示例数据:
library(dplyr) df <- data.frame(stringsAsFactors=FALSE, product = c("aa", "bb", "cc"), act_rev_mtd = c(100L, 110L, 120L), rev_fcast_p1 = c(100L, 100L, 100L), rev_fcast_p2 = c(110L, 110L, 110L) ) reporting_mth <- "p1"
然后动态计算每行的平方差(如果需要整体方差可以后续用summarize):
df %>% mutate( # 拼接出完整的预测列名,用.data[[...]]动态引用 fcast_squared_diff = (act_rev_mtd - .data[[paste0("rev_fcast_", reporting_mth)]])^2 )
方法2:使用tidyeval的sym()和!!(经典动态引用方式)
如果你习惯tidyeval语法,也可以用符号注入的方式实现:
# 把字符串格式的列名转换成dplyr能识别的符号 fcast_col <- sym(paste0("rev_fcast_", reporting_mth)) df %>% mutate( fcast_squared_diff = (act_rev_mtd - !!fcast_col)^2 )
扩展:计算数据集整体方差
如果你的需求是计算整个数据集的预测值与实际值的方差(而非每行的平方差),可以改用summarize:
df %>% summarize( fcast_overall_variance = var(act_rev_mtd - .data[[paste0("rev_fcast_", reporting_mth)]]) )
这两种方法都能完美适配你动态传入reporting_mth的场景,不用硬编码列名,灵活度拉满~
内容的提问来源于stack exchange,提问作者cephalopod
相关产品推荐
相关产品推荐

