如何在dplyr的group_by中调用多个变量(Shiny交互场景)
解决dplyr中用字符串向量动态分组的问题
嗨,这个问题我之前也碰到过!原因很简单:group_by()默认接受的是不带引号的裸列名,而不是字符串向量。不过别担心,有好几种办法能解决这个动态分组的需求,给你一一说明:
方法1:用pick()(推荐,dplyr 1.0.0+)
这是dplyr新版本推出的专门用于列选择的函数,对字符串向量支持非常友好,搭配all_of()就能精准引用向量里的列名:
columns <- c("Sepal.Length", "Species") iris %>% group_by(pick(all_of(columns))) %>% summarise(Sum.Sepal.Width = sum(Sepal.Width))
all_of()的作用是明确告诉dplyr:我们要使用的是预先定义好的字符串向量里的列名,避免语法歧义。
方法2:用syms()和非标准求值(旧版本兼容)
如果你的dplyr版本比较旧,可以用符号转换的方式:先把字符串向量转为符号向量,再用!!!(unquote-splice)展开成group_by()的参数:
columns <- c("Sepal.Length", "Species") iris %>% group_by(!!!syms(columns)) %>% summarise(Sum.Sepal.Width = sum(Sepal.Width))
syms()负责把字符串转成dplyr能识别的符号,!!!则把这些符号逐个传入group_by(),效果和直接写裸列名完全一样。
方法3:用across()
虽然across()主要用于mutate()或summarise()里的多列操作,但也能在group_by()中使用:
columns <- c("Sepal.Length", "Species") iris %>% group_by(across(all_of(columns))) %>% summarise(Sum.Sepal.Width = sum(Sepal.Width))
这三种方法都能完美适配Shiny的交互场景,比如你可以把用户通过selectInput()选择的列名存进向量,再传入分组函数里,动态生成结果。
内容的提问来源于stack exchange,提问作者Wlademir Ribeiro Prates
相关产品推荐
相关产品推荐

