Примените функцию к нескольким наборам данных с помощью lapply

#r #dataframe #dplyr #dataset #lapply

#r #фрейм данных #dplyr #набор данных #lapply

Вопрос:

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

Я попробовал приведенный ниже код: первые 3 строки описывают создание переменной, которую я пытаюсь применить с помощью функции, созданной ниже.

 data1 <- data1 %>%
  dplyr::group_by(id)%>%
  dplyr::mutate(new_var = sum(score))


list_data <- c(data1, data2, data3)
my_func <- function(x) {
  x <- x %>%
  dplyr::group_by(id) %>%
  dplyr::mutate(new_var = sum(score))
}

lapply(list_data, my_func)

 

Я получаю сообщение об ошибке

нет применимого метода для ‘group_by’, применяемого к объекту класса «character».

Не могли бы вы, пожалуйста, помочь мне разобраться в этом?

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

1. Ваша функция не использует аргумент x

2. Кроме того, у вас отсутствует символ pipse ( %>% ) после group_by()

3. Кроме того, я думаю, что использование c( объединяет все ваши данные вместо составления списка ваших структур данных. Попробуйте использовать list_data <- list(data1, data2, data3) вместо этого.

4. К сожалению, все это были опечатки, я запустил отредактированную версию кода. @RomainB. Я пробовал это, но это не изменило результат.

5. @unisateur Это зависит от ваших структур данных, но если вам конкретно нужен список каких-либо объектов, использование list безопаснее, поскольку оно всегда будет вести себя таким образом. Чтобы привести пример, если data1, 2 и 3 были фреймами данных, то c( функция создаст большой список со всеми их столбцами, а не список из 3 фреймов данных, как list это делает.

Ответ №1:

для меня это работает нормально:

 my_func <- function(x) {
  x <- x %>%
    dplyr::group_by(id) %>%
    dplyr::mutate(new_var = sum(score))
}
data1 <- data.frame(id = rep(1:3, each = 3), score = 1:9)
data2 <- data.frame(id = rep(1:3, each = 3), score = 11:19)
data3 <- data.frame(id = rep(1:3, each = 3), score = 21:29)


list_data <- list(data1, data2, data3)
lapply(list_data, my_func)