Использование map_dbl с вложенным df неправильный доступ к фрейму данных?

#r #purrr

Вопрос:

Я работаю над проектом, в котором мне нужно найти расстояние между множеством моделей поведения, которые измеряются в 3-мерном пространстве, и предварительно определенной точкой в 3-мерном пространстве. Я написал функцию для вычисления расстояния между точкой и одним поведением, которая работает, когда я применяю ее только к одному поведению. Однако мне нужно применить его к ~750 моделям поведения в более крупном кадре данных. Поэтому я надеюсь вложить более крупные данные о поведении по терминам, а затем применить функцию к каждому из этих вложенных кадров данных, используя map_dbl. Тем не менее, я продолжаю получать ошибку:

Ошибка: Проблема с mutate() колонкой distance . ℹ distance = map_dbl(data, calc_distance_from_beh) . столбцы x-соединения должны присутствовать в данных. x Проблема с dim . ℹ Ошибка произошла в строке 1.

Похоже, что что-то происходит, когда map_dbl применяется к вложенным кадрам данных, где он не может получить доступ к столбцу «dim» для присоединения, и я не уверен, почему.

Я включил воспроизводимый пример ниже всего с двумя вариантами поведения.

Воспроизводимый пример:

 behaviors <- tibble(term = rep(c("abandon", "abet"), each = 3),
                   estimate = c(-3.31, -0.08, -0.11, 0.03, 0.34, -0.18),
                   dim = c("E", "P", "A", "E", "P", "A"))

optimal_behavior <- tibble(actor = "civil_engineer",
                          object = "civil_engineer",
                          opt_beh = c(1.905645, 0.9960085, -0.17772678),
                          dim = c("E", "P", "A"))


calc_distance_from_beh <- function(nested_df){
  
      optimal_behavior <- as_tibble(optimal_behavior)
      nested_df <- as_tibble(nested_df)
      
      df_for_calculations <- left_join(optimal_behavior, nested_df, by = "dim")
      
      df_for_calculations %>% 
            mutate(dist = (estimate-opt_beh)^2) %>% 
            summarise(total_dist = sum(dist)) %>% 
        pull()
}


behaviors_distance <- behaviors %>% 
                      nest_by(term) %>% 
                      mutate(distance = map_dbl(data, calc_distance_from_beh))
 

Комментарии:

1. ах, прошу прощения! поведение должно говорить, что там оценка. Исходная ошибка все еще возникает, но я отредактирую свой reprex, чтобы исправить это.

Ответ №1:

Если столбец «значение» назван как estimate , сразу ungroup после nest_by (потому nest_by что создает rowwise атрибут, который предотвращает map доступ к каждому элементу)

 library(purrr)
library(dplyr)
behaviors %>% 
          nest_by(term) %>% 
          ungroup %>%
          mutate(distance = map_dbl(data, calc_distance_from_beh))
# A tibble: 2 × 3
  term                  data distance
  <chr>   <list<tibble[,2]>>    <dbl>
1 abandon            [3 × 2]    28.4 
2 abet               [3 × 2]     3.95
 

Или вместо map этого мы можем напрямую применить функцию в том виде , в mutate каком она есть rowwise

 behaviors %>%
    nest_by(term) %>%
    mutate(distance = calc_distance_from_beh(data)) %>%
    ungroup
 

-выход

 # A tibble: 2 × 3
  term                  data distance
  <chr>   <list<tibble[,2]>>    <dbl>
1 abandon            [3 × 2]    28.4 
2 abet               [3 × 2]     3.95