如何阻止tidyverse在lapply中重命名分组列?附原因解析
问题原因与解决方法
为什么列名会变成get(col)?
当你在group_by()里使用get(col)时,dplyr会把函数调用的表达式本身作为分组列的名称,而非解析col对应的原列名。因为get(col)是动态调用,dplyr默认会保留这个调用的字面形式,所以最终列名就变成了get(col)。
解决办法(三种可行方式)
方法1:使用.data代词推荐
dplyr提供的.data代词可直接通过字符串引用数据框列,同时保留原列名:
df <- data.frame(a = c(1, 1, 1), b = c(1, 1, 1), c = c(1, 1, 1)) lapply(c("a", "b"), function(col) { assign(col, df %>% group_by(.data[[col]]) %>% summarize(), env = .GlobalEnv) })
运行后,全局环境中的a和b对象会保留原列名"a"、"b"。
方法2:使用across()函数
通过across(all_of(col))也能正确解析列名并保留原名称:
lapply(c("a", "b"), function(col) { assign(col, df %>% group_by(across(all_of(col))) %>% summarize(), env = .GlobalEnv) })
方法3:使用rlang的准引用(!! + sym())
若熟悉rlang语法,可将字符串转成符号后解引用:
library(rlang) lapply(c("a", "b"), function(col) { assign(col, df %>% group_by(!!sym(col)) %>% summarize(), env = .GlobalEnv) })
内容的提问来源于stack exchange,提问作者myusername
相关产品推荐
相关产品推荐

