使用dplyr按sample_id批量新增列时循环报错如何解决
错误原因
你写的两种写法不符合dplyr的非标准求值规则:
- 第一种写法中
mutate(name = ...)里的name会被直接识别为固定列名"name",不会解析为循环变量存储的样本名,所以最后只生成了一列叫name的列 - 第二种写法中
mutate左侧不能直接放带索引的变量表达式,不符合dplyr语法要求,会直接报语法错误
正确实现方案
方案1:修改for循环
用:=操作符配合字符串插值指定动态列名,同时用.env代词明确取环境中的循环变量,避免变量名冲突:
for (name in sample_names) { comb.variant <- comb.variant %>% mutate("{name}" := if_else(sample_id == .env$name, Alt, Ref)) }
如果使用的dplyr版本低于1.0,可替换为!!强制解析变量的写法:
for (name in sample_names) { comb.variant <- comb.variant %>% mutate(!!name := if_else(sample_id == name, Alt, Ref)) }
方案2:purrr批量生成(无需显式循环)
配合map_dfc批量生成所有样本列后绑定到原数据框,代码更简洁:
library(purrr) library(dplyr) comb.variant <- comb.variant %>% { bind_cols(., map_dfc(sample_names, ~tibble("{.x}" := if_else(.$sample_id == .x, .$Alt, .$Ref)))) }
内容的提问来源于stack exchange,提问作者zw_nz
相关产品推荐
相关产品推荐

