dplyr:忽略函数输入的分组变量

dplyr:忽略函数输入的分组变量,r,dplyr,R,Dplyr,我正在尝试使用tidyverse工具(而不是for循环)对一些组进行评估,这些组将使用mvabund包中的程序进行评估 基本上,对于这个过程,我需要一个数据框架,首先只包含数字列(物种丰度),然后对下游过程的变量进行分组 但是,如果我想在多个分组上这样做,我需要包括分组变量。但是,当使用group_by时,这些非数值变量仍然存在,并且该过程将不会运行 如何使用dplyr将数值变量传递给(mvabund)函数 如果我只参加一个小组,过程如下: library(tidyverse) library(

我正在尝试使用
tidyverse
工具(而不是for循环)对一些组进行评估,这些组将使用
mvabund
包中的程序进行评估

基本上,对于这个过程,我需要一个数据框架,首先只包含数字列(物种丰度),然后对下游过程的变量进行分组

但是,如果我想在多个分组上这样做,我需要包括分组变量。但是,当使用
group_by
时,这些非数值变量仍然存在,并且该过程将不会运行

如何使用
dplyr
将数值变量传递给(mvabund)函数

如果我只参加一个小组,过程如下:

library(tidyverse)
library(mvabund)    
df <- data.frame(Genus.species1 = rep(c(0, 1), each = 10), 
                        Genus.species2 = rep(c(1, 0), each = 10),
                        Genus.species3 = sample(1:100,20,replace=T),
                        Genus.species4 = sample(1:100,20,replace=T),
                        GroupVar1 = rep(c("Site1", "Site2"), each=2, times=5),
                        GroupVar2 = rep(c("AA", "BB"), each = 10), 
                        GroupVar3 = rep(c("A1", "B1"), times=10))

df1 <- filter(df, GroupVar2 == "AA" & GroupVar3 == "A1") # get desired subset/group
df2 <- select(df1, -GroupVar1, -GroupVar2, -GroupVar3) # retain numeric variables

MVA.fit <- mvabund(df2) # run procedure
MVA.model <- manyglm(MVA.fit ~ df1$GroupVar1, family="negative binomial") # here I need to bring back GroupVar1 for this procedure
MVA.anova <- anova(MVA.model, nBoot=1000, test="wald", p.uni="adjusted")
MVA.anova$table[2,] # desired result
但下一步并不是这样

mva.tt %>%  mutate(MANY = map(data, ~ manyglm(.x ~ GroupVar1, family="negative binomial")))
此外,一旦我试图删除总和为零或包含分组的列,一切都会失败

使用
dplyr
和管道是否有一种明智的方法?或者循环的
是答案吗

编辑:
最初,我问了这个问题:另外,当分组时,数据帧将包含全部为零的列,通常我会删除这些列。我可以拥有变量数量不同的
dplyr
分组吗?”但评论显示,考虑到我建议的设置,这是不可能的。因此我仍然对上述内容感兴趣。

将步骤复制到函数中。在最后一行中还添加了分组信息以进行区分

fun <- function(df) {
   df1 <- select(df, -GroupVar1, -GroupVar2, -GroupVar3) 
   df3 <- df1 %>% select_if(~sum((.)) > 0) 
   MVA.fit <- mvabund(df3) 
   MVA.model <- manyglm(MVA.fit ~ df$GroupVar1, family="negative binomial") 
   MVA.anova <- anova(MVA.model, nBoot=1000, test="wald", p.uni="adjusted")
   cbind(Group2 = df$GroupVar2[1], Group3 = df$GroupVar3[1], MVA.anova$table[2,])
}

将步骤复制到函数中。还在最后一行添加了组信息以进行区分

fun <- function(df) {
   df1 <- select(df, -GroupVar1, -GroupVar2, -GroupVar3) 
   df3 <- df1 %>% select_if(~sum((.)) > 0) 
   MVA.fit <- mvabund(df3) 
   MVA.model <- manyglm(MVA.fit ~ df$GroupVar1, family="negative binomial") 
   MVA.anova <- anova(MVA.model, nBoot=1000, test="wald", p.uni="adjusted")
   cbind(Group2 = df$GroupVar2[1], Group3 = df$GroupVar3[1], MVA.anova$table[2,])
}

这里有很多问题,“我能有变量数量不同的dplyr分组吗?”?“不是。TIBLES和数据帧一样,是矩形的。分组是一个附加属性,组实际上并不是分开的。也许使用
split
处理数据帧列表对您更有利,或者你可以使用
group\u map
group\u walk
对每个组进行操作,包括过滤或选择不同的列,然后将其传递给
mvabund
。group\u map和group\u walk看起来很有前景。这里有很多问题。“我可以拥有变量数量不同的dplyr分组吗?”不可以。TIBLES和数据帧一样,都是矩形的。分组是一个附加属性,组实际上并不是分开的。也许使用
split
处理数据帧列表更适合您,或者您可以使用
groupu-map
groupu-walk
对每个组进行操作,包括在将其传递给
mvabund
之前过滤或选择不同的列。groupu-map和groupu-walk看起来非常有前景。
library(tidyverse)
library(mvabund)   

df %>%
  group_split(GroupVar2, GroupVar3) %>%
  map_dfr(fun)

#Time elapsed: 0 hr 0 min 0 sec
#Time elapsed: 0 hr 0 min 0 sec
#Time elapsed: 0 hr 0 min 0 sec
#Time elapsed: 0 hr 0 min 0 sec
#  Group2 Group3 Res.Df Df.diff     wald Pr(>wald)
#1     AA     A1      3       1 1.028206 0.7432567
#2     AA     B1      3       1 2.979169 0.1608392
#3     BB     A1      3       1 2.330708 0.2137862
#4     BB     B1      3       1 1.952617 0.2567433