#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