如何在dplyr::summarise中使用paste生成字符型列名?
在dplyr::summarise中动态生成字符型列名的方法
当然可以实现类似你第三种示例的写法,核心是用dplyr的动态赋值运算符:=,搭配解引用符号!!来处理生成的列名字符串。
你的第三种写法行不通,是因为summarise的左侧默认是语法层面的列名定义,不能直接放置函数调用结果,需要通过动态语法将字符串转为有效的列名标识。
具体实现方式
方法1:直接用paste0生成列名并解引用
i <- "name" iris %>% filter(Species == "setosa") %>% summarise(!!paste0("Sum_", i) := sum(Sepal.Length))
这里!!paste0("Sum_", i)会先执行paste0生成字符串"Sum_name",再通过!!将其解引用为有效的列名,最后用:=完成赋值。
方法2:结合glue语法更直观
如果需要更清晰的字符串拼接(比如复杂变量组合),可以用glue包的语法:
library(glue) i <- "name" iris %>% filter(Species == "setosa") %>% summarise(!!glue("Sum_{i}") := sum(Sepal.Length))
这种写法更贴近自然语言的拼接逻辑,可读性更强。
扩展:批量生成动态列名
如果需要批量生成动态命名的汇总列,还可以结合across的.names参数(dplyr 1.0.0+版本支持):
cols_to_sum <- c("Sepal.Length", "Sepal.Width") suffix <- "setosa_sum" iris %>% filter(Species == "setosa") %>% summarise(across(all_of(cols_to_sum), ~sum(.x), .names = "{.col}_{suffix}"))
这里.names直接支持glue风格的动态命名,无需额外的!!和:=,写法更简洁。
内容的提问来源于stack exchange,提问作者user5514978
相关产品推荐
相关产品推荐

