如何在R中使用sym()实现循环生成带_ln后缀的对数变量?
批量生成连续变量的对数列解决方案
你之前的代码报错核心原因:purrr::map(dat[vars], ...)遍历的是数据框的列(具体数值向量),但sym()需要传入变量名字符串,不是向量值,因此无法完成符号转换。
以下是几种可行的实现方式:
方法一:用purrr::reduce累积生成新列
通过遍历变量名字符串,逐步向数据框添加对数列:
vars <- c('fev1', 'fvc', 'rat') dat <- vars %>% purrr::reduce(.init = dat, ~ .x %>% mutate(!!paste0(.y, "_ln") := log(.data[[.y]])))
reduce以原始数据框dat为初始值,依次处理每个变量名!!paste0(.y, "_ln")动态生成新列名,.data[[.y]]安全引用当前变量
方法二:用dplyr::across批量处理(最简洁)
dplyr的across专门用于批量操作变量,无需显式循环:
dat <- dat %>% dplyr::across(all_of(vars), ~log(.), .names = "{col}_ln")
all_of(vars)指定要处理的变量.names = "{col}_ln"直接定义新列名为原列名加_ln后缀
方法三:基础for循环(直观易懂)
用基础R循环实现,逻辑清晰:
vars <- c('fev1', 'fvc', 'rat') for (var in vars) { dat[[paste0(var, "_ln")]] <- log(dat[[var]]) }
- 遍历每个变量名,通过列表索引直接生成新列
运行任意一种方法后,都能得到你期望的结果:
dat # fev1 fvc rat sex fev1_ln fvc_ln rat_ln # 1 3.4 3.9 0.80 0 1.223775 1.360977 -0.22314355 # 2 5.8 6.2 0.91 1 1.757858 1.824549 -0.09431068 # 3 3.1 4.5 0.90 0 1.131402 1.504077 -0.10536052 # 4 NA 6.0 NA 1 NA 1.791759 NA
内容的提问来源于stack exchange,提问作者DavidMB
相关产品推荐
相关产品推荐

