R语言按变量名规则批量生成_ln后缀对数衍生变量的解决方案
问题原因
你写的代码存在两处核心问题:
- 老旧版本的
mutate_if语法不支持直接动态生成新变量名,你写的~ paste0(.,"_ln") = log(.)属于语法错误,R无法识别这种左侧动态拼接变量名的赋值写法 - 目前dplyr官方已经推荐用
across()替代原来的mutate_if/ mutate_at/ mutate_all系列函数,灵活性更高
方案1:tidyverse(dplyr 1.0.0+ 版本适用)
直接用across()的.names参数控制新生成的变量名即可,代码如下:
library(dplyr) df_final <- df %>% mutate(across( # 指定筛选列的规则:不以sym开头,不以pct结尾 .cols = !starts_with("sym") & !ends_with("pct"), # 对选中列应用对数函数 .fns = log, # 新变量名规则:原列名加_ln后缀 .names = "{.col}_ln" ))
运行后就能得到你期望的输出结果,自动批量处理所有符合规则的变量,不需要手动逐个写列名。
方案2:base R 实现
不需要加载任何第三方包,代码如下:
# 先筛选符合条件的目标列名 target_cols <- names(df)[!startsWith(names(df), "sym") & !endsWith(names(df), "pct")] # 批量生成新列并赋值 df[paste0(target_cols, "_ln")] <- lapply(df[target_cols], log)
如果需要保留原数据集不修改,可以先复制一份再操作:
df_final <- df target_cols <- names(df_final)[!startsWith(names(df_final), "sym") & !endsWith(names(df_final), "pct")] df_final[paste0(target_cols, "_ln")] <- lapply(df_final[target_cols], log)
内容的提问来源于stack exchange,提问作者Alexis
相关产品推荐
相关产品推荐

