R中使用for循环结合mutate动态计算原变量与预测变量差值的报错问题
报错原因
你代码中的original和pred是存储列名的字符串向量,直接在mutate内执行original[i] - pred[i]本质是对两个字符串做减法运算,因此触发二元运算符参数为非数值类型的报错。你需要通过对应语法将字符串格式的列名映射为数据框内的实际数值列。
修复方案(for loop + mutate 实现)
library(dplyr) # 提取列名的逻辑保持不变 original <- d %>% select(starts_with('dv.')) %>% names(.) pred <- d %>% select(starts_with('pred_dv.')) %>% names(.) for (i in 1:length(original)){ # 提前生成差值列的列名 diff_col <- paste0(original[i], '.diff') d <- d %>% # !! 是动态解析变量的语法,:= 支持左侧传入动态生成的列名 # .data[[字符串]] 可以根据字符串列名提取对应列的实际数值 mutate(!!diff_col := .data[[original[i]]] - .data[[pred[i]]]) }
可选优化:tidyverse 无循环实现
如果不需要强制使用for循环,也可以用across函数批量计算所有差值列,代码更简洁:
d <- d %>% mutate(across(starts_with("dv."), # cur_column() 获取当前遍历的列名,拼接得到对应预测列的名称 ~ .x - get(paste0("pred_", cur_column())), # 自动生成差值列的列名 .names = "{.col}.diff"))
内容的提问来源于stack exchange,提问作者J.K.
相关产品推荐
相关产品推荐

