Использование Dplyr в определенной пользователем функции для обобщения данных и их построения - PullRequest
0 голосов
/ 21 ноября 2018

Я пытаюсь использовать dplyr внутри функции, чтобы создать пользовательскую функцию, в которой я могу передать несколько аргументов для суммирования данных с помощью dplyr, а затем отобразить их с помощью ggplot.

Вот некоторые примеры данных и то, что яя пытаюсь сделать с dplyr затем заговор

df <-data.frame(Year = c("2006", "2006", "2006", "2007", "2007", "2007", "2008", "2009", "2010", "2010", "2009", "2009"), JudicialOrientation = c("Defense", "Plaintiff", "Plaintiff", "Neutral", "Defense", "Plaintiff", "Defense", "Plaintiff", "Neutral", "Neutral", "Plaintiff","Defense"), Loss = c(100000, 100, 2500, 100000, 25000, 0, 7500, 5200, 900, 100, 0, 50))

df1 <- df %>%
  group_by(Year, JudicialOrientation) %>%
  summarise(MeanLoss =mean(Loss))

ggplot(df1, aes(x = JudicialOrientation, y = MeanLoss, color = Year, group  =Year)) + 
  geom_line() +
  geom_point()

Я сейчас пытаюсь скопировать это в пользовательскую функцию, чтобы я мог передавать различные переменные для получения аналогичных результатов.

Вот моя попыткадо сих пор:

ConsistencyPlot <- function(df,var1,timevar,lossvar){

  df1 <- df %>%
    group_by_(df[timevar], df[var1]) %>%
    summarise_(MeanLoss = mean(df[lossvar]))

  ggplot(df1, aes(x = var1, y = MeanLoss, color = timevar, group = timevar)) +
    geom_line() +
    geom_point()

}

ConsistencyPlot(df,"JudicialOrientation","Year",'Loss')

Я копирую ту же логику и передаю df как мой фрейм данных, var1 как JudicialOrientation, timevar как Year и lossvar как мойвектор Loss значений, которые я хочу, усредняется через summarise.Однако я не могу получить те же результаты, поэтому чувствую, что что-то упустил из-за того, как эти функции используются в замыкании.

1 Ответ

0 голосов
/ 21 ноября 2018

Прежде всего, внутри функций dplyr вам не нужно вызывать переменные, индексирующие фрейм данных, например df[, timevar].Используйте только имя переменной.Кроме того, при индексации фрейма данных необходимо указать, вызываете ли вы столбцы или строки, поэтому df[timevar] неверно.

О функции это проблема оценки.

Эта структураниже работает:

ConsistencyPlot <- function(df, var1, timevar, lossvar){
  var1 <- enquo(var1)
  timevar <- enquo(timevar)
  lossvar <- enquo(lossvar)

  df1 <- df %>%
    group_by(!!timevar, !!var1) %>%
    summarise(MeanLoss = mean(!!lossvar))

  ggplot(df1, aes(x = !!var1, y = MeanLoss, color = !!timevar, group = !!timevar)) +
    geom_line() +
    geom_point()
}

Посмотрите, что параметры были преобразованы с помощью enquo(), а затем переданы в функцию с помощью !!.Таким образом, вы можете передавать аргументы без кавычек.

ConsistencyPlot(df, JudicialOrientation, Year, Loss)

Надеюсь, вы найдете это полезным.

...