Переход от устаревшей суммы к новой сумме в dplyr
У меня есть функция, которая вычисляет средства сгруппированной базы данных для столбца, который выбирается на основе содержимого переменной VarName
, Текущая функция использует dplyr::summarize_
, но теперь я вижу, что это устарело, и я хочу заменить его, прежде чем он будет полностью удален.
Тем не менее, я не уверен, как использовать новую отмену цитирования для достижения того, что я пытаюсь сделать. Вот мой текущий код:
means<-summarize_(group_by(dat,Grade),.dots = setNames(paste0('mean(',VarName,',na.rm=TRUE)'),'means'))
Я пытался заменить .dots
расставаться с means=mean(!!VarName, na.rm=TRUE)
, но это только что вернуло строку внутри VarName. Мне нужно, чтобы строка в VarName была оценена как имя столбца в dat
, так что я получу имя столбца "означает" со средним значением каждой группы. Как я могу добиться этого с новым 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))
Спасибо!
2 ответа
Превращение этого в функцию и обобщение для произвольных данных, группирующей переменной и переменной значения:
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
Использование !!
с 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