如何在R的dplyr循环中保留分组列的原始列名?
解决方法
这里有几种简单的修改方式,能让输出列名显示原始列名而非get(g):
方法1:使用整洁评估(推荐)
利用dplyr的整洁评估语法,把字符串形式的列名转为符号注入到group_by中,这样分组后的列名会直接保留原始名称:
library(dplyr) df <- mtcars groups <- c('cyl', 'hp') for(g in groups) { group_counts <- df %>% group_by({{ sym(g) }}) %>% # sym()将字符串转成符号,{{}}注入到group_by count() print(group_counts) }
方法2:分组后重命名列
如果习惯用get(),可以在计数完成后把get(g)对应的列重命名为原始列名:
library(dplyr) df <- mtcars groups <- c('cyl', 'hp') for(g in groups) { group_counts <- df %>% group_by(get(g)) %>% count() %>% rename(!!g := `get(g)`) # !!强制求值变量g,作为新列名替换原列 print(group_counts) }
方法3:使用group_by_at
group_by_at支持直接传入字符串形式的列名,不需要额外转换:
library(dplyr) df <- mtcars groups <- c('cyl', 'hp') for(g in groups) { group_counts <- df %>% group_by_at(vars(g)) %>% # vars(g)接收字符串列名 count() print(group_counts) }
这三种方法都能实现你要的效果,输出的第一列会显示cyl、hp这样的原始列名。
内容的提问来源于stack exchange,提问作者BWolk
相关产品推荐
相关产品推荐

