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