Я изучаю R для анализа данных и использую этот набор данных Kaggle. После сценария рекомендации фильма работает, но когда я пытаюсь обобщить код dplyr
, сделав его функцией, я получаю сообщение об ошибке:
Я пытался устранить некоторые неполадки. Похоже, код останавливается на функциях filter
и mutate
.
Следующее работает и дает ожидаемый результат.
genres <- df %>%
filter(nchar(genres)>2) %>%
mutate(
separated = lapply(genres, fromJSON)
) %>%
unnest(separated, .name_repair = "unique") %>%
select(id, title, keyword = name) %>%
mutate_if(is.character, factor)
Оборачивание этого кода в функцию приводит к сообщению об ошибке:
make_df <- function(list_df){
df %>%
filter(nchar(list_df)>2) %>%
mutate(
separated = lapply(list_df, fromJSON)
) %>%
unnest(separated, .name_repair = "unique") %>%
select(id, title, keyword = name) %>%
mutate_if(is.character, factor)
}
Ожидаемые результаты:
> head(genres)
# A tibble: 6 x 3
# id title keyword
# <dbl> <fct> <fct>
# 1 19995 Avatar Action
# 2 19995 Avatar Adventure
# 3 19995 Avatar Fantasy
# 4 19995 Avatar Science Fiction
# 5 285 Pirates of the Caribbean: At World's End Adventure
# 6 285 Pirates of the Caribbean: At World's End Fantasy
Фактические результаты:
> make_df(genres)
# Error: Result must have length 4803, not 3
# --- Traceback ---
# 12. stop(structure(list(message = "Result must have length 4803, not 3",
# call = NULL, cppstack = NULL), class = c("Rcpp::exception",
# "C++Error", "error", "condition")))
# 11. filter_impl(.data, quo)
# 10. filter.tbl_df(., nchar(list_df) > 2)
# 9. filter(., nchar(list_df) > 2)
# 8. function_list[[i]](value)
# 7. freduce(value, `_function_list`)
# 6. `_fseq`(`_lhs`)
# 5. eval(quote(`_fseq`(`_lhs`)), env, env)
# 4. eval(quote(`_fseq`(`_lhs`)), env, env)
# 3. withVisible(eval(quote(`_fseq`(`_lhs`)), env, env))
# 2. df %>% filter(nchar(list_df) > 2) %>% mutate(separated = lapply(list_df,
# fromJSON)) %>% unnest(separated, .name_repair = "unique") %>%
# select(id, title, keyword = name) %>% mutate_if(is.character,
# factor)
# 1. make_df(genres)
Фактические результаты без строки фильтра:
> make_df(genres)
# Error: Argument 'txt' must be a JSON string, URL or file.
# 15. base::stop(..., call. = FALSE)
# 14. stop("Argument 'txt' must be a JSON string, URL or file.")
# 13. FUN(X[[i]], ...)
# 12. lapply(list_df, fromJSON)
# 11. mutate_impl(.data, dots, caller_env())
# 10. mutate.tbl_df(., separated = lapply(list_df, fromJSON))
# 9. mutate(., separated = lapply(list_df, fromJSON))
# 8. function_list[[i]](value)
# 7. freduce(value, `_function_list`)
# 6. `_fseq`(`_lhs`)
# 5. eval(quote(`_fseq`(`_lhs`)), env, env)
# 4. eval(quote(`_fseq`(`_lhs`)), env, env)
# 3. withVisible(eval(quote(`_fseq`(`_lhs`)), env, env))
# 2. df %>% mutate(separated = lapply(list_df, fromJSON)) %>% unnest(separated,
# .name_repair = "unique") %>% select(id, title, keyword = name) %>%
# mutate_if(is.character, factor)
# 1. make_df(genres)