Запустить purrr::map_dfr в строках фрейма данных?

Учитывая 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()

  })

}

Пожалуйста, сообщите, почему он не использует строки данных?

просто map_dfr(iris, foo)? Работает с map_dfr(mtcars, sqrt), но я думаю, вы ищете что-то другое. Можете ли вы объяснить детали foo и ожидаемый результат?

Ronak Shah 06.03.2019 09:40

Почему бы просто не использовать применить? применить (фрейм данных, 1, сд)

Esben Eickhardt 06.03.2019 09:42

Просто не делай этого.

David Arenburg 06.03.2019 09:43

@RonakShah проблема в том, что мой фрейм данных огромен, и я вижу неожиданные результаты, когда запускаю его, используя параллельную версию purrr, furrr::map_dfr.

SteveS 06.03.2019 09:43

@DavidArenburg спасибо за ваш очень полезный комментарий!

SteveS 06.03.2019 09:44

@EsbenEickhardt Вскоре я опубликую заголовок фрейма данных и функцию, которую использую.

SteveS 06.03.2019 09:44

Если ваш фрейм данных слишком велик для эффективной работы, есть два варианта: 1. Работайте с плоским файлом вместо этого и занимайте только немного памяти в то время, 2. Используйте пакет SparkR.

Esben Eickhardt 06.03.2019 09:46

@EsbenEickhardt, пожалуйста, взгляните на мое обновление вопроса

SteveS 06.03.2019 09:52

@RonakShah, пожалуйста, взгляните на мое обновление вопроса

SteveS 06.03.2019 09:53
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
9
965
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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))

SteveS 06.03.2019 09:57

Это должно сделать также

kwiscion 06.03.2019 10:02

Похоже, проблема с функцией extract_scroll_data. Вы уверены, что настроили его так, чтобы он принимал 3 аргумента, а не только data.frame, как в вопросе?

kwiscion 06.03.2019 10:09

Конечно, я сделал. Я думаю, проблема в том, что если я использую pmap со списком из 3 векторов, он не использует 1 элемент из всех 3, затем второй, затем 3-й, но все комбинации.

SteveS 06.03.2019 10:18

Что ж, должно. Попробуйте этот код, чтобы узнать его поведение: pmap(list(c('a', 'b', 'c'), c('x', 'y', 'z')), paste)

kwiscion 06.03.2019 10:38

Другие вопросы по теме