Переход от устаревшей суммы к новой сумме в 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
Другие вопросы по тегам