R中dplyr::mutate在函数内执行计算时新增列列名异常问题
问题原因
- 核心是dplyr
mutate的赋值逻辑和基础R的<-赋值逻辑不同:你在mutate中写的RefMaterials[1,known] - AllGlut1[colm],因为[提取数据框列返回的是单列数据框(自带原列名d.15N.14N),mutate遇到带列名的单列数据框作为赋值内容时,会优先使用数据框自带的列名,覆盖你手动指定的res_drift。而你在控制台直接用<-赋值时,<-会忽略右侧内容的原有列名,直接用你指定的变量名,所以结果符合预期。 - 额外的写法问题:你自定义函数中硬编码操作全局变量
AllGlut1,没有使用传入的df参数,全局变量改名后函数会直接失效。
修复方案
使用tidyverse提供的.data代词,通过字符串参数指定操作列,返回的是无列名的向量,mutate就会使用你指定的新列名:
# 修正后的函数 driftcorr <- function(colm, known, df){ df <- df %>% mutate(res_drift = RefMaterials[1, known] - .data[[colm]]) return(df) } # 调用测试 results <- driftcorr(colm, known, AllGlut1)
如果要让函数更健壮,建议把RefMaterials也作为参数传入,避免依赖全局变量:
driftcorr <- function(colm, known, df, ref){ df <- df %>% mutate(res_drift = ref[1, known] - .data[[colm]]) return(df) } results <- driftcorr(colm, known, AllGlut1, RefMaterials)
内容的提问来源于stack exchange,提问作者Andi Noakes
相关产品推荐
相关产品推荐

