Учитывая dataframe, скажем iris по умолчанию, как настроить функцию purrr::map_dfr() для запуска в каждой строке dataframe и выполнения функции foo.
Вот одна строка моего df, учтите, что значение всегда большое JSON:
structure(list(Key = "2019/01/04/14/[email protected]_2ed026cb-8e9f-4392-9cc4-9f580b9d3aab_1345a5a4-3d5b-48a0-a678-67ed09a6f487_2019-01-04-14-52-43-537",
LastModified = "2019-01-04T14:52:44.000Z", ETag = "\"1c6269ab8b7baa85f0d2567de417f0d0\"",
Size = 35280, Owner = "e7c0d260939d15d18866126da3376642e2d4497f18ed762b608ed2307778bdf1",
StorageClass = "STANDARD", Bucket = "comp-kukupupu-streamed-data",
user_name = "[email protected]", value = list(---here goes a large json),
obs_id = 1137L), row.names = 1L, class = "data.frame")
и моя функция:
extract_scroll_data <- function(df) {
tryCatch({
j <- fromJSON(unlist(df$value))
if (is_empty(fromJSON(j$sensorsData)) | is_empty(fromJSON(j$eventList))) {
return(tibble())
} else {
return(set_names(as_tibble(fromJSON(j$eventList, bigint_as_char = TRUE),
.name_repair = "unique"),
nm = c("time_stamp",
"x", "y", "size",
"pressure", "scroll", "state")) %>%
dplyr::mutate("user_name" = df$user_name,
"obs_id" = df$obs_id))
}
}, warning = function(war) {
# Warning handler picks up where error was generated:
print(paste0("Warning: occured at ", df$obs_id, war))
}, error = function(err) {
# error handler picks up where error was generated
print(paste0("Error: occured at ", df$obs_id, err))
}, finally = {
gc()
})
}
Пожалуйста, сообщите, почему он не использует строки данных?
Почему бы просто не использовать применить? применить (фрейм данных, 1, сд)
Просто не делай этого.
@RonakShah проблема в том, что мой фрейм данных огромен, и я вижу неожиданные результаты, когда запускаю его, используя параллельную версию purrr, furrr::map_dfr.
@DavidArenburg спасибо за ваш очень полезный комментарий!
@EsbenEickhardt Вскоре я опубликую заголовок фрейма данных и функцию, которую использую.
Если ваш фрейм данных слишком велик для эффективной работы, есть два варианта: 1. Работайте с плоским файлом вместо этого и занимайте только немного памяти в то время, 2. Используйте пакет SparkR.
@EsbenEickhardt, пожалуйста, взгляните на мое обновление вопроса
@RonakShah, пожалуйста, взгляните на мое обновление вопроса





map_dfr(), как и любой другой член семейства map, перебирает список, а data.frame на самом деле представляет собой список столбцов. Вы можете проверить это с помощью typeof(iris) и as.list(iris). Чтобы заставить map_dfr() перебирать строки, вам нужно преобразовать data.frame в список строк с помощью функции split().
iris %>%
split(1:nrow(.)) %>%
purrr::map_dfr(do_stuff)
Как насчет использования: furrr::future_pmap_dfr(list(data_df$user_name, data_df$obs_id, data_df$value), function(x, y, z) extract_scroll_data(x, y, z))
Это должно сделать также
Похоже, проблема с функцией extract_scroll_data. Вы уверены, что настроили его так, чтобы он принимал 3 аргумента, а не только data.frame, как в вопросе?
Конечно, я сделал. Я думаю, проблема в том, что если я использую pmap со списком из 3 векторов, он не использует 1 элемент из всех 3, затем второй, затем 3-й, но все комбинации.
Что ж, должно. Попробуйте этот код, чтобы узнать его поведение: pmap(list(c('a', 'b', 'c'), c('x', 'y', 'z')), paste)
просто
map_dfr(iris, foo)? Работает сmap_dfr(mtcars, sqrt), но я думаю, вы ищете что-то другое. Можете ли вы объяснить деталиfooи ожидаемый результат?