使用purr和map迭代因变量(tidyverse)

时间:2017-09-05 00:31:52

标签: r tidyverse purrr

我有一个简单的数据集,我想使用aovtidyverse迭代因变量。从那些输出,我然后想要计算Tukey HSD测试。我有一个for循环结构的工作,但我正在努力从这种心态迁移。我在使用自变量迭代aov函数时看到了this post。试图将这个逻辑融入我的工作流程,但没有那么好。任何可以引导我朝正确方向前进的tidyverse爱好者?

library(tidyverse)
library(data.table)

pfuel <- fread("data/CFL.csv") %>%
  mutate(AFCL = AFCL*10,
         LCW = LCW*10,
         DCW = DCW*10,
         LiDe = ifelse(Status == "Li", "Live", "Dead")) %>%
  filter(S.F == "S") %>%
  group_by(Site, Year, Age, Plot) %>%
  select(LiFol, DeFol, Li.1hr, De.1hr, Li.10hr, De.10hr, Li.100hr, De.100hr) %>%
  summarise_all(sum) %>%
  ungroup() %>%
  mutate(sb_age = paste0(Year, Age))

aov.models = pfuel %>%
  select (-c(Year, Age)) %>%
  select(LiFol, DeFol, Li.1hr, De.1hr, Li.10hr, De.10hr, Li.100hr, De.100hr, Site, Plot, sb_age) %>%
  map(~ aov(.x ~ sb_age + Site/Plot, data = pfuel))

aov.models运行时,我生成此错误:

Error in lm.fit(x, y, offset = offset, singular.ok = singular.ok, ...) : 
  NA/NaN/Inf in 'y'
In addition: Warning message:
In model.response(mf, "numeric") : NAs introduced by coercion

我还没有接受过Tukey测试,因为我无法通过aov功能。任何建议将不胜感激!

您可以在此处找到数据:https://www.dropbox.com/s/yb8rh860fc7fff2/CFL.csv?dl=0

谢谢!

2 个答案:

答案 0 :(得分:1)

将数据转换为长格式,按响应分割,然后拟合模型并将输出提供给HSD.test函数可能更容易,例如

aov.models <- pfuel %>%
  select(-Year, -Age) %>%
  gather(variable, value, -sb_age, -Site, -Plot) %>%
  split(.$variable) %>%
  map(~ aov(value ~ sb_age + Site/Plot, data = .x)) %>%
  map(HSD.test, trt = 'sb_age')

我还删除了其中一个select()语句,因为它选择了所有列。

答案 1 :(得分:0)

@ Z.Lin在你的指导下,我找到了问题第一部分的解决方案。可能不是最优雅的,但至少它现在正在工作!任何改进都会受到欢迎,但谢谢。

pfuel_var <- pfuel %>%
  select(Site, Plot, sb_age) %>%
  mutate(Site = as.factor(Site),
         Plot = as.factor( Plot),
         sb_age = as.factor(sb_age))

aov.models <- pfuel %>%
  select(LiFol, DeFol, Li.1hr, De.1hr, Li.10hr, De.10hr, Li.100hr, De.100hr) %>%
  map(~ aov(.x ~ pfuel_var$sb_age + pfuel_var$Site/pfuel_var$Plot, data = pfuel))

我的问题的第二部分是如何将此输出从HSD.test包中提供给agricolae。有人对此有什么看法吗?

我的想法是:

t <- aov.models %>% 
   map(~ HSD.test(.x, "pfuel_var$sb_age", alpha=0.1))

但这不能正常工作。非常感谢。