从不推荐使用的 summarize_ 移动到 dplyr 中的新 summarize_
Moving from deprecated summarize_ to new summarize in dplyr
我有一个函数可以根据变量 VarName
的内容为选择的列计算分组数据库的均值。当前函数使用 dplyr::summarize_
,但现在我看到它已被弃用,我想在它完全删除之前替换它。
但是,我不确定如何使用新的取消引用来实现我想要做的事情。这是我当前的代码:
means<-summarize_(group_by(dat,Grade),.dots = setNames(paste0('mean(',VarName,',na.rm=TRUE)'),'means'))
我尝试用 means=mean(!!VarName, na.rm=TRUE)
替换 .dots
部分,但这只是返回了 VarName 中的字符串。我需要的是将 VarName 中的字符串评估为 dat
中的列名,这样我将得到一个列名 "means" 以及每个组的平均值。如何使用新的 summarize
?
实现这一目标
再现性样本数据集:
VarName<-"Things"
dat<-data.frame(students=c("a","b","c","d","e"),Grade=c(2,2,2,3,3),varA=c(41:45),Things=c(90,100,80,75,80))
谢谢!
将 !!
与 as.name
或 as.symbol
一起使用:
dat %>%
group_by(Grade) %>%
summarize(means = mean(!!as.name(VarName), na.rm=T))
# or summarize(means = mean(!!as.symbol(VarName), na.rm=T))
# A tibble: 2 x 2
# Grade means
# <dbl> <dbl>
#1 2.00 90.0
#2 3.00 77.5
将其转换为函数并对任意数据、分组变量和值变量进行泛化:
library(tidyverse)
means <- function(data, group, value) {
group = enquo(group)
value = enquo(value)
value_name = paste0("mean_", value)[2]
data %>% group_by(!!group) %>%
summarise(!!value_name := mean(!!value, na.rm=TRUE))
}
means(dat, Grade, Things)
Grade mean_Things
<dbl> <dbl>
1 2.00 90.0
2 3.00 77.5
如果我理解你的评论,下面的函数怎么样,它接受一个字符串作为 value
参数:
means <- function(data, group, value) {
group = enquo(group)
value_name = paste0("mean_", value)
value = sym(value)
data %>% group_by(!!group) %>%
summarise(!!value_name := mean(!!value, na.rm=TRUE))
}
VarName = "Things"
means(dat, Grade, VarName)
Grade mean_Things
<dbl> <dbl>
1 2.00 90.0
2 3.00 77.5
由于函数是泛化的,您可以对任何数据框执行此操作。例如:
means(mtcars, cyl, "mpg")
cyl mean_mpg
<dbl> <dbl>
1 4.00 26.7
2 6.00 19.7
3 8.00 15.1
您可以进一步概括该函数。例如,此版本采用任意数量的分组列:
means <- function(data, value, ...) {
group = quos(...)
value_name = paste0("mean_", value)
value = sym(value)
data %>% group_by(!!!group) %>%
summarise(!!value_name := mean(!!value, na.rm=TRUE))
}
VarName = "Things"
means(dat, VarName, students, Grade)
students Grade mean_Things
<fct> <dbl> <dbl>
1 a 2.00 90.0
2 b 2.00 100
3 c 2.00 80.0
4 d 3.00 75.0
5 e 3.00 80.0
我有一个函数可以根据变量 VarName
的内容为选择的列计算分组数据库的均值。当前函数使用 dplyr::summarize_
,但现在我看到它已被弃用,我想在它完全删除之前替换它。
但是,我不确定如何使用新的取消引用来实现我想要做的事情。这是我当前的代码:
means<-summarize_(group_by(dat,Grade),.dots = setNames(paste0('mean(',VarName,',na.rm=TRUE)'),'means'))
我尝试用 means=mean(!!VarName, na.rm=TRUE)
替换 .dots
部分,但这只是返回了 VarName 中的字符串。我需要的是将 VarName 中的字符串评估为 dat
中的列名,这样我将得到一个列名 "means" 以及每个组的平均值。如何使用新的 summarize
?
再现性样本数据集:
VarName<-"Things"
dat<-data.frame(students=c("a","b","c","d","e"),Grade=c(2,2,2,3,3),varA=c(41:45),Things=c(90,100,80,75,80))
谢谢!
将 !!
与 as.name
或 as.symbol
一起使用:
dat %>%
group_by(Grade) %>%
summarize(means = mean(!!as.name(VarName), na.rm=T))
# or summarize(means = mean(!!as.symbol(VarName), na.rm=T))
# A tibble: 2 x 2
# Grade means
# <dbl> <dbl>
#1 2.00 90.0
#2 3.00 77.5
将其转换为函数并对任意数据、分组变量和值变量进行泛化:
library(tidyverse)
means <- function(data, group, value) {
group = enquo(group)
value = enquo(value)
value_name = paste0("mean_", value)[2]
data %>% group_by(!!group) %>%
summarise(!!value_name := mean(!!value, na.rm=TRUE))
}
means(dat, Grade, Things)
Grade mean_Things <dbl> <dbl> 1 2.00 90.0 2 3.00 77.5
如果我理解你的评论,下面的函数怎么样,它接受一个字符串作为 value
参数:
means <- function(data, group, value) {
group = enquo(group)
value_name = paste0("mean_", value)
value = sym(value)
data %>% group_by(!!group) %>%
summarise(!!value_name := mean(!!value, na.rm=TRUE))
}
VarName = "Things"
means(dat, Grade, VarName)
Grade mean_Things <dbl> <dbl> 1 2.00 90.0 2 3.00 77.5
由于函数是泛化的,您可以对任何数据框执行此操作。例如:
means(mtcars, cyl, "mpg")
cyl mean_mpg <dbl> <dbl> 1 4.00 26.7 2 6.00 19.7 3 8.00 15.1
您可以进一步概括该函数。例如,此版本采用任意数量的分组列:
means <- function(data, value, ...) {
group = quos(...)
value_name = paste0("mean_", value)
value = sym(value)
data %>% group_by(!!!group) %>%
summarise(!!value_name := mean(!!value, na.rm=TRUE))
}
VarName = "Things"
means(dat, VarName, students, Grade)
students Grade mean_Things <fct> <dbl> <dbl> 1 a 2.00 90.0 2 b 2.00 100 3 c 2.00 80.0 4 d 3.00 75.0 5 e 3.00 80.0