我正在尝试使用dplyr和purrr整理来自模拟研究的结果。我的结果保存为数据框列表,其中包含几种不同分类算法的结果,我正在尝试使用purrr和dplyr来总结这些结果。
我正在努力计算 - 分配给每个群集的对象数 - 群集中实际属于群集的对象数 - 使用3种不同算法(KEEP1 - KEEP3)的真阳性,假阳性,假阴性和真阴性的数量 - 对于2个算法,我可以访问群集中的概率,因此我可以将其与alpha的替代选择进行比较 - 因此我可以使用不同的alpha选择来计算真阳性等。
我发现了这个: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')
现在,我想使用map对整个列表执行此操作。但是,我无法再访问变量“正确”(它已经远远不足以看不到alpha或alpha0,但可能会出现相同的问题)。我还在学习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')
)
在地图中,我没有在$ group_by(k)$中看到变量'k',除非引用$ group_by('k')$,但是当我刚使用pmap时我不需要引用它。我已经尝试了各种方法将正确的变量传递给这些函数,但我还在学习dplyr和purrr,但还没有成功。
还有一个注意事项 - 实际数据存储为常规数据框,因此我需要在pmap函数中使用$ as_tibble()$。当我在这个例子中删除它时遇到了一些不同的错误,所以我选择将其添加回去,这样我就会遇到同样的问题。谢谢!
答案 0 :(得分:2)
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
的{{1}}语法来定义map
以尝试解决此问题。其余部分看起来还不错(虽然我切换到df1
返回一个数据框(列表的结构很难看,而且pmap_df
是最简单的方法,如果它是&#39 ; s不是预期的输出。
pmap_df
与group_by("k")
另外:写group_by(k)
实际上创建了一个变量&#34; k&#34;并用字符&#34; k&#34;填充它,然后用它来分组。这将使您的代码运行,但它不会做您喜欢的。有时候这种问题实际上是因为错误发生在一两行之前(或者,group_by("k")
,之前是一两个管道)。在这种情况下,dplyr
并未将map
传递到您需要的位置。