map + pmap, не могу найти переменные
Я пытаюсь сопоставить результаты исследования с использованием dplyr и purrr. Мои результаты сохраняются в виде списка фреймов данных с результатами нескольких различных алгоритмов классификации, и я пытаюсь использовать purrr и dplyr для обобщения этих результатов.
Я пытаюсь вычислить - количество объектов, назначенных каждому кластеру - количество объектов в кластере, которые фактически принадлежат кластеру - количество истинных положительных, ложных положительных, ложных отрицательных и истинных отрицательных значений, используя 3 разных алгоритма (KEEP1 - KEEP3) - для двух алгоритмов у меня есть доступ к вероятности нахождения в кластере, поэтому я могу сравнить это с альтернативными вариантами альфа - и поэтому я могу вычислить истинные положительные значения и т. д., используя другой выбор альфы.
Я нашел это: https://github.com/tidyverse/dplyr/issues/3101, который я успешно использовал в одном элементе списка, чтобы получить именно то, что я хотел:
f <- function(.x, .y) {
sum(.x & .y)
}
actions <- list(
.vars = lst(
c('correct'),
c('KEEP1', 'KEEP2', 'KEEP3'),
c('pval1', 'pval2')
),
.funs = lst(
funs(Nk = length, N_correct = sum),
funs(
TP1 = f(., .y = correct),
FN1 = f(!(.), .y = correct),
TN1 = f(!(.), .y = !(correct)),
FP1 = f(., .y = !(correct))
),
funs(
TP2 = f((. < alpha0) , .y = correct),
FN2 = f(!(. < alpha0), .y = correct),
TN2 = f(!(. < alpha0), .y = !(correct)),
FP2 = f((. < alpha0), .y = !(correct))
)
)
)
reproducible_data <- replicate(2,
data_frame(
k = factor(rep(1:10, each = 20)), # group/category
correct = sample(x = c(TRUE, FALSE), 10 * 20, replace = TRUE, prob = c(.8, .2)),
pval1 = rbeta(10 * 20, 1, 10),
pval2 = rbeta(10 * 20, 1, 10),
KEEP1 = pval1 < 0.05,
KEEP2 = pval2 < 0.05,
KEEP3 = runif(10 * 20) > .2,
alpha0 = 0.05,
alpha = 0.05 / 20 # divided by no. of objects in each group (k)
),
simplify = FALSE)
# works
df1 <- reproducible_data[[1]]
pmap(actions, ~df1 %>% group_by(k) %>% summarize_at(.x, .y)) %>%
reduce(inner_join,by = 'k')
Теперь я хочу использовать карту, чтобы сделать это для всего списка. Однако я больше не могу получить доступ к переменной "правильная" (она не зашла достаточно далеко, чтобы не видеть альфа или альфа0, но, вероятно, возникнет та же проблема). Я все еще изучаю dplyr/purrr, но мои эксперименты не оказались полезными.
# does not work
out_summary <- map(
reproducible_data,
pmap(actions, ~ as_tibble(.) %>% group_by("k") %>% summarize_at(.x, .y)) %>%
reduce(inner_join,by = 'k')
)
# this doesn't either
out_summary <- map(
reproducible_data,
pmap(actions, ~ as_tibble(.) %>% group_by("k") %>% summarize_at(.x, .y, alpha = alpha, alpha0 = alpha0, correct = correct)) %>%
reduce(inner_join,by = 'k')
)
В карте я не вижу переменную 'k' в $group_by(k)$, если она не заключена в кавычки $group_by('k')$, но мне не нужно заключать ее в кавычки, когда я только что использовал pmap. Я пробовал разные способы передачи правильных переменных в эти функции, но я все еще изучаю dplyr и purrr, но пока не удалось.
Еще одно замечание - фактические данные хранятся в виде обычного фрейма данных, поэтому мне нужно $as_tibble()$ в функции pmap. Я столкнулся с некоторыми другими ошибками, когда я удалил его в этом примере, поэтому я решил добавить его обратно, чтобы получить те же проблемы. Спасибо!
1 ответ
Попробуй это
map(
reproducible_data,
function(df1) {
pmap(actions, ~ df1 %>%
as_tibble() %>%
group_by(k) %>%
summarize_at(.x, .y)) %>%
reduce(inner_join, by = "k")
}
)
Я думаю, что ваши аргументы могут быть перепутаны при использовании map
а также pmap
в то же время. Я использовал function
синтаксис для map
определить df1
чтобы попытаться это исправить. В остальном все выглядит нормально (хотя я перешел на pmap_df
вернуть фрейм данных (структура списка была безобразна без него и pmap_df
был самый простой способ сделать его красивым. Lmk, если это не ожидаемый результат.
Также проблема с group_by("k")
против group_by(k)
Также: написание group_by("k")
фактически создает переменную "k" и заполняет ее символами "k", а затем использует ее для группировки. Это заставит ваш код работать, но он не будет делать то, что вам нравится. Иногда такая проблема действительно возникает из-за ошибки, которая возникает на одну или две строки раньше (или, если dplyr
Труба или две раньше). В этом случае, map
не проходил df1
где это было нужно