У меня есть список примерно из тысячи фреймов данных, и я применяю функцию ко всем этим фреймам данных с помощью lapply. Однако кажется, что есть восемь элементов списка (фреймов данных), которые генерируют это предупреждающее сообщение:
In mapply(FUN = f, ..., SIMPLIFY = FALSE) :
longer argument not a multiple of length of shorter
Итак, в основном я хотел бы просто отследить элементы, которые генерируют ошибку, чтобы я мог внести в них необходимые исправления, но не знаю, как это сделать. До сих пор я просто просматривал фреймы данных по отдельности, применяя к ним функцию и проверяя, генерирует ли конкретный фрейм данных ошибку (например, testdata <- my_function(df[[1]], "X")
), но, как и ожидалось, это занимает целую вечность, лол.
Вы можете попробовать это с possibly()
. Например. если некоторые значения не являются числовыми, мы не можем разделить на них число (отсюда ошибка). Дополнительные сведения об обработке ошибок с помощью purrr
см. в статье https://aosmith.rbind.io/2020/08/31/handling-errors/.
library(purrr)
library(dplyr)
my_function <- function(x) { 20/x}
find_error = possibly(.f = my_function, otherwise = NULL)
df <-
list(
df1 = tibble(values =c(1,2,3)),
df2 = tibble(values = c("1","2","3")
))
df %>%
map(find_error) %>%
keep(~is.null(.x))
Обычно я нахожу purrr::quietly()
полезным, когда получаю предупреждения (для ошибок possibly()
лучше). Это генерирует список со следующими элементами на итерацию:
Вот репрекс о том, как идентифицировать кадры данных, которые вызывают у вас проблемы:
library(purrr)
# Replace "log" with your function, and the vector with your list of dataframes
res <-
c(10, 20, -1) %>%
map(quietly(log)) # note the quietly()
# This gives you the first index where you got a warning
res %>%
detect_index(~length(.x$warnings) > 0)
#> [1] 3
# With this map you can find the warning of all dataframes, also those who don't
# have any. The index will tell you where all problems are
res %>%
map(~.x$warnings)
#> [[1]]
#> character(0)
#>
#> [[2]]
#> character(0)
#>
#> [[3]]
#> [1] "NaNs produced"
# With keep you can see all results from iterations with warnings
res %>%
keep(~length(.x$warnings) > 0)
#> [[1]]
#> [[1]]$result
#> [1] NaN
#>
#> [[1]]$output
#> [1] ""
#>
#> [[1]]$warnings
#> [1] "NaNs produced"
#>
#> [[1]]$messages
#> character(0)
Created on 2022-04-05 by the reprex package (v2.0.1)
Использовал этот код: res <- df %>% map(quietly(my_function))
Из вашего примера видно, что my_function()
имеет более 1 аргумента. Просто передайте дополнительный аргумент как таковой: df %>% map(quietly(my_function), argument = value)
. Например: df %>% map(quietly(my_function), "X")
Благодарю вас! Но по какой-то причине я получил «Ошибка: ! Нижний индекс не может отсутствовать для тибблов в
[[
». когда я пытался запустить самый первый блок в свой список фреймов данных?