#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)