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

#r #filter #dplyr #lapply

Вопрос:

Я попытался применить функцию к нескольким наборам данных, используя функцию lapply. Более конкретно, я попытался применить фильтр к каждому набору данных, чтобы удалить определенные строки, где страна==»Бельгия-Люксембург». Однако я получаю сообщение об ошибке. Мой код и ошибка приведены ниже.

 datasets <- c("df1", "df2", "df3")
my_func <- function(x) {
  x <- x %>%
   filter(!country %in% c("Belgium-Luxembourg"))
}
lapply(datasets, my_func)
 
 Error code: Error in UseMethod("filter") : 
  no applicable method for 'filter' applied to an object of class "character" 
 

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

Любая помощь будет признательна.

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

1. Ошибка точно сообщает вам, что происходит: ваш datasets вектор-это вектор символов, а не список фреймов данных (последнее-то, что вам нужно). То есть "df1" это просто символьная строка, а не фрейм данных. Так что используйте datasets <- list(df1, df2, df3)

2. спасибо, @heds1, я больше не получаю ошибку. Однако, похоже, что функция lapply не сработала. Я все еще нахожу строки, связанные со страной==Бельгия-Люксембург, во всех моих кадрах данных. Интересно, не упускаю ли я еще какие-нибудь шаги?

Ответ №1:

Используется mget для получения фактических объектов списка и возврата конечного результата функции.

 library(dplyr)

datasets <- c("df1", "df2", "df3")

my_func <- function(x) {
  x %>% filter(!country %in% c("Belgium-Luxembourg"))
}

result <- lapply(mget(datasets), my_func)
 

Чтобы увидеть эти изменения в исходном кадре данных, используйте

 list2env(result, .GlobalEnv)
 

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

1. Я получаю ошибку Ошибка в методе использования(«mget», клиент) : нет применимого метода для «mget», применяемого к объекту класса «список».

2. Это потому, что ты изменился datasets <- c("df1", "df2", "df3") на datasets <- list(df1, df2, df3) .

3. это верно, но когда я этого не делаю, я получаю ту же ошибку для класса «символ». т. Е. «Ошибка в методе использования(«mget», клиент) : нет применимого метода для «mget», применяемого к объекту класса»символ»».

4. Есть ли у вас другая mget функция в вашей среде? Попробуйте использовать base::mget вместо этого. Если вы изменили datasets datasets <- list(df1, df2, df3) , то вам это не нужно mget , и вы можете сделать result <- lapply(datasets, my_func) , а затем использовать list2env , чтобы увидеть эти изменения в реальных кадрах данных.