Повторное использование функций R

#aggregate

#агрегат

Вопрос:

Я пытаюсь использовать один и тот же блок кода для анализа в течение 3 разных лет.

 year = c("Year.2006", "Year.2016", "Year.2031")

    for(x in year){
      print(x)
      print(new_Data$x)
      Tot_data <- setNames(aggregate(new_Data$x, by=list(State = new_Data$State), FUN=sum), c("state","total"))
      children_data <- new_Data[new_Data$Age_num <= 15,]
      ...}
  

Пытаюсь заменить экземпляры year в приведенном выше коде для использования в функции. Как мне провести годы в aggregate?

dput(head(new_Data))

  structure(list(Age = c("0", "0", "0", "0", "0", "0"), State = c("NSW", 
"Vic", "QLD", "SA", "WA", "Tas"), X2006 = c("6,024", "1255", 
"5,324", "1007", "2,391", "679"), X2016 = c("6,597", "1,480", 
"5,295", "986", "2,300", "644"), X2031 = c("8,517", "2,122", 
"7,205", "1,254", "2,767", "808"), Age_num = c(0, 0, 0, 0, 0, 
0), Year.2006 = c(6024, 1255, 5324, 1007, 2391, 679), Year.2016 = c(6597, 
1480, 5295, 986, 2300, 644), Year.2031 = c(8517, 2122, 7205, 
1254, 2767, 808)), row.names = c(NA, 6L), class = "data.frame")
  

Комментарии:

1. @RonakShah отметил. Отредактировано.

2. В вашем коде выше есть combined_df$x для вычисления growth_rate , но у вас нигде нет x столбца в ваших данных. Откуда берется этот столбец или это должно быть что-то другое?

3. Отредактировано в приведенном коде. Просто предыдущий шаг перед combined_df$x

Ответ №1:

Не тестировал это из-за отсутствия воспроизводимого примера, но вы можете запустить aggregate функцию, передав formula объект. Создайте объект формулы с помощью reformulate передачи year в качестве символьного значения и используйте [[ для извлечения значения столбца в виде вектора.

 aggregated_data <- function(new_data, year) {
  Tot_data <- setNames(aggregate(reformulate('State', year), new_data, sum), c("state","total"))
  children_2016_data <- new_data[new_data$Age_num <= 15,]
  total_sum_by_state <- aggregate(reformulate('State', year), children_2016_data, sum)
  combined_df = cbind(total_sum_by_state,Tot_data)
  growth_rate <- combined_df
  growth_rate$percentage <- growth_rate[[year]]/growth_rate$total * 100
  max_child_pop_2016_state <- as.character(growth_rate$State[which.max(growth_rate$percentage)])
  max_child_pop_2016_percentage <- as.character(growth_rate$percentage[which.max(growth_rate$percentage)])
  sprintf("The regions with maximum children population in the %s is %s with percentage as %s",year, max_child_pop_2016_state, max_child_pop_2016_percentage)
}
  

Теперь запустите это с помощью lapply :

 year = c("Year.2006", "Year.2016", "Year.2031")
lapply(year, aggregated_data, new_data = new_data)
  

Комментарии:

1. Мои типы данных следующие: State<chr> x<dbl> state<chr> total<dbl> Я получаю эту ошибку: Ошибка в x / total: нечисловой аргумент для двоичного оператора

2. @Новичок, ты можешь добавить dput(head(new_data)) ?

3. добавлено к вопросу

4. @Новичок Проверьте обновленный ответ, работает ли он для ваших данных.