You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何阻止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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 00:46:00