让 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)
两者都有效。
我正在尝试编写一个函数来执行拆分应用组合,其中拆分变量是参数,并且 - 重要的是 - 可以接受空拆分。例如,运行 数据子集或整个数据集的统计数据。
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)
两者都有效。