map + pmap,找不到变量

Mel*_*Key 6 r pmap dplyr purrr

我正在尝试使用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')
Run Code Online (Sandbox Code Playgroud)

现在,我想使用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')
)
Run Code Online (Sandbox Code Playgroud)

在map中,我没有在$ group_by(k)$中看到变量'k',除非引用$ group_by('k')$,但是当我刚使用pmap时我不需要引用它.我已经尝试了各种方法将正确的变量传递给这些函数,但我还在学习dplyr和purrr,但还没有成功.

还有一点需要注意 - 实际数据存储为常规数据帧,因此我需要在pmap函数中使用$ as_tibble()$.当我在这个例子中删除它时遇到了一些不同的错误,所以我选择将其添加回去,这样我就会遇到同样的问题.谢谢!

Jes*_*dle 4

尝试这个

map(
  reproducible_data,
  function(df1) { 
    pmap(actions,  ~ df1 %>% 
                       as_tibble() %>% 
                       group_by(k) %>% 
                       summarize_at(.x, .y)) %>% 
      reduce(inner_join, by = "k")
  } 
)
Run Code Online (Sandbox Code Playgroud)

我认为你的论点在同时使用map和时可能会混淆。pmap我使用了function语法来map定义df1来尝试解决这个问题。其余部分看起来不错(尽管我切换到pmap_df返回一个数据帧(没有它,列表的结构很丑陋,并且pmap_df是使其漂亮的最简单方法。LMK,如果它不是预期的输出。)

group_by("k")还有vs的问题group_by(k)

另外:写入group_by("k")实际上创建了一个变量“k”并用字符“k”填充它,然后使用它进行分组。这将使您的代码运行,但它不会做您喜欢的事情。有时,这种问题实际上是由于之前一两行(或者,dplyr之前一两行)发生的错误造成的。在这种情况下,map没有经过df1您需要的地方。