Re: [问题] 用*apply或dplyr::do批次跑ANOVA

楼主: celestialgod (天)   2015-11-17 22:07:25
※ 引述《helixc (@_2;)》之铭言:
: [问题叙述]:
: 手上有一笔资料,基本上要看在四个不同样区(site)当中,物种种类(SpeciesType)
: 如何影响某个值(n),资料如:http://pastebin.com/qyLga5Za ,要跑ANOVA和TukeyHSD。
: 要用工人智慧自己写一样的程式码四次目前是做得到的,但总想找到更聪明的方法。
: 理想上想要写个程式一次把重要的统计字段(如F-value, P-value...etc)整理出来。
: 看了各种资料,知道在R当中各种*apply是向量化处里资料重要的指令,
: 我想做的工作理论上可以用*apply实现。
: 但目前只对基础的apply比较熟悉,sapply/lapply今天摸一摸才比较懂,
: 而tapply/mapply还还没有机会用过。
: 在股狗的过程当中也发现dplyr::do也可以做类似的工作,也查到了Wush978的简略介绍,
: 但用一用还是有点卡住...是因为dplyr::do只能处里data.frame的关系吗?
: *apply或dplyr::do的参考资料都是这个网页 http://goo.gl/WYJXtC
: [程式范例]:
目前我觉得这种最漂亮还是用map XD (PS: map其实就是lapply而已)
library(data.table)
library(magrittr)
library(purrr)
dat = fread('test.txt')
models = split(dat, dat$site) %>% map(~aov(n~SpeciesType, .))
AOVtables = models %>% map(~summary(.)) %>%
map(~na.omit(c(.[[1]][['F value']], .[[1]][['Pr(>F)']]))) %>%
do.call(rbind, .) %>% set_colnames(c("F", "p.value"))
TukeyHSDtables = models %>% map(~TukeyHSD(.)$SpeciesType)
: 3. 改用dplyr::do来写,用aov,但怎么写都会吐错误讯息...
: data<-data %>% group_by(site)
: models <-data %>% do(mdls=aov(n~SpeciesType, data=.))
: models %>% rowwise %>% do(data.frame(summary(.$mdls)))
: 错误讯息:
: Error in as.data.frame.default(x[[i]], optional = TRUE, stringsAsFactors =
: stringsAsFactors) : cannot coerce class "c("summary.aov", "listof")" to
: a data.frame
我个人不太爱用do,我的使用经验上,do在很多时候会很慢
之前遇到的案例:
set.seed(100)
library(plyr)
library(dplyr)
N = 1e7
dat = data.frame(V1 = rnorm(N), V2 = rbinom(N, 4, .2),
V3 = rbinom(N, 3, .1), V4 = rbinom(N, 5, .2))
st = proc.time()
out1 = dat %>% group_by(V2, V3, V4) %>% arrange(V1) %>% do(head(., n = 1))
proc.time() - st
# user system elapsed
# 20.06 0.11 20.17
st = proc.time()
out2 = ddply(dat, .(V2, V3, V4), function(x) x[which.min(x$V1),])
proc.time() - st
# user system elapsed
# 1.90 0.45 2.35
st = proc.time()
out3 = dat %>% group_by(V2, V3, V4) %>% filter(rank(V1) == 1)
proc.time() - st
# user system elapsed
# 3.30 0.08 3.39
all.equal(out1, out2 %>% arrange(V2, V3, V4)) # TRUE
all.equal(out1, out3 %>% arrange(V2, V3, V4)) # TRUE
作者: helixc (@_2;)   2015-11-17 23:06:00
要去研究purrr了吗啊啊啊啊啊啊看来还是把*apply学起来比较实在…

Links booklink

Contact Us: admin [ a t ] ucptt.com