我有一个具有不同丰度的物种数据框,我想知道它们的丰度是否与某些参数有关。
我认为我应该能够做一些像
这样的事情# Load in the dune data set and tidyverse
library(vegan)
data(dune)
data(dune.env)
library(tidyverse)
# Reshape the species matrix into long form data
duneM <- dune %>% rownames_to_column('Site') %>% gather(Species, Count, -Site)
# Join the species and environmental data
duneE <- dune.env %>% rownames_to_column('Site')
duneJ <- left_join(duneM, duneE, by = 'Site')
# Basic linear model, that compares species counts to moisture data
my_lm <- function(df){
lm(Count ~ Moisture, data = df)
}
# Group the data by species and apply the function to each one
duneJ %>% group_by('Species') %>% map(my_lm)
令我惊讶的是,我收到以下错误消息。
显然,我在这里遗漏了一些东西。有人可以澄清一下吗?感谢。eval中的错误(predvars,data,env):类型的'envir'参数无效 'character'Trackback:
- duneJ%&gt;%group_by(“Species”)%&gt;%map(my_lm)
- withVisible(eval(quote(`_fseq`(`_lhs`)),env,env))
- eval(quote(`_fseq`(`_lhs`)),env,env)
- eval(quote(`_fseq`(`_lhs`)),env,env)
- `_fseq`(`_lhs`)
- freduce(value,`_ function_list`)
- withVisible(function_list [K])
- function_list [K]
- map(。,my_lm)
- .f(.x [[i]],...)
- lm(Count~M含,data = df)#在文件第2行
- eval(mf,parent.frame())
- eval(mf,parent.frame())
- stats :: model.frame(formula = Count~M含,data = df,drop.unused.levels = TRUE)
- model.frame.default(formula = Count~M含,data = df,drop.unused.levels = TRUE)
- eval(predvars,data,env)
醇>
答案 0 :(得分:0)
它帮助我查看了这篇文章http://omaymas.github.io/Climate_Change_ExpAnalysis/,以及此视频https://www.youtube.com/watch?v=rz3_FDVt9eg,了解如何最好地使用purrr和扫帚。正如G. Grothendeik指出的那样,我可以在数据框中添加一个带有模型的列(每个单元格都是完整的模型)。使用map函数执行此操作的方法是
duneJ %>% group_by(Species) %>% nest %>% mutate(Mod = map(data, my_lm0)) -> test
此处,nest
是一个关键函数,它使列成为数据框列表,每个数据框都包含有关每个物种的数据并将其保存到名为“data”的默认列中。我在mutate函数内部运行map
以将模型保存到另一列,其中每个单元格都是新模型。
如果我想查看模型结果,我可以将它们组合成一个包含地图和扫帚的数据框列表,选择相关数据,然后unnest
它们,如下所示:
test %>% mutate(Glance = map(Mod, glance)) %>% select(Species, Glance) %>% unnest
这为我提供了一个新的数据框架,其中包含每个物种的模型结果,这是我最终的目标,即使我没有在问题中完全解释这一点。