让 tidyr::nest() -> purrr:map() 工作流程适用于无分组变量的特殊情况

Getting the tidyr::nest() -> purrr:map() workflow to work for special case of no grouping var

我正在尝试编写一个函数来执行拆分应用组合,其中拆分变量是参数,并且 - 重要的是 - 可以接受空拆分。例如,运行 数据子集或整个数据集的统计数据。

somedata=expand.grid(a=1:3,b=1:3)

somefun=function(df_in,grpvars=NULL){

  df_in %>% group_by_(.dots=grpvars) %>% nest() %>%
    mutate(X2.Resid=map(data,~with(.x,chisq.test(b)$residuals))) %>%
    unnest(data,X2.Resid) %>% return()

}

somefun(somedata,"a") # This works
somefun(somedata) # This fails

null 条件失败,因为 nest() 似乎需要一个变量来嵌套,而不是将整个 df 嵌套到 1x1 data.frame。我可以通过以下方式解决这个问题:

somefun2=function(df_in,grpvars="Dummy"){

  df_in$Dummy=1
  df_in %>% group_by_(.dots=grpvars) %>% nest() %>%
    mutate(X2.Resid=map(data,~with(.x,chisq.test(b)$residuals))) %>%
    unnest(data,X2.Resid) %>%
    select(-Dummy) %>% return()

}

somefun2(somedata) # This works

但是,我想知道是否有更优雅的方法来解决这个问题,而不需要虚拟变量?

嗯,这种行为让我有点惊讶。不过修复很简单:你只需要确保嵌套 everything():

somefun3 <- function(df_in, grpvars = NULL) {
  df_in %>% 
    group_by_(.dots = grpvars) %>% 
    nest(everything()) %>% 
    mutate(X2.Resid = map(data, ~with(.x, chisq.test(b)$residuals))) %>%
    unnest()
}
somefun3(somedata, "a")
somefun3(somedata) 

两者都有效。