#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
, чтобы увидеть эти изменения в реальных кадрах данных.