我正在尝试在aov()
行中使用tapply()
函数,并且不确定它是否可行,或者我是否只是错误编码。
Factors<-c("Factor 1", "Factor 2")
Years<-c("Year 1", "Year 2", "Year 3","Year 4", "Year 5")
width<-rnorm(100)
height<-rnorm(100)
mydata<-data.frame(Years,Factors,width,height)
我想看看每年的因子水平之间是否存在差异。请注意,我的实际数据有几个因子级别,这就是我使用ANOVA而不是t检验的原因。
我可以tapply()
执行“简单”功能,例如sum
:
with(mydata,tapply(width,Factors,FUN="sum"))
从简单的例子中,我认为tapply()
的工作方式是它基本上通过第二个条目Factors
对数据进行子集,然后获取第一个条目width
,然后放入它被声明为任何函数。通过这个推理,我试过了:
with(mydata,tapply(width~Factors,Years,FUN="aov"))
这会返回错误arguments must have the same length
。
如果可以将tapply
用于需要复杂输入的功能,我该如何进行此操作?我预计如何存储这样的输出存在问题。例如,如果我保存了2个anova,我想将它们保存为单个“变量名称”。
width.anova<-with(mydata,aov(width~Factors))
height.anova<-with(mydata,aov(height~Factors))
all.anovas<-c(width.anova, height.anova)
我希望能够做的是(*以下代码不起作用,只是为了展示我所得到的):
#all.anovas$width.anova
显然c()
功能不起作用。我知道为了能够使用$
语法,我应该使用数据框,但以下内容不起作用:
all.anovas<-data.frame(width.anova, height.anova)
如果有更简单的方法来获得我正在寻找的结果,那么非常感谢任何有关该做什么的提示。同样,我正在寻找5个anovas - 比较5年中每个因子水平1和2之间的差异。实际上,我的数据有8年和5个因子水平。我将在几个变量(如宽度和高度)上做这些anova。
答案 0 :(得分:6)
你使用了错误的功能。你可能想要更像这样的东西:
lapply(split(mydata,mydata$Years),function(x) aov(width ~ Factors,data = x))
或者您可以使用 plyr 包并执行以下操作:
dlply(mydata,.(Years),function(x) aov(width ~ Factors,data = x))
tapply
通常用于处理向量,因此对于更复杂的对象,您需要一个不同的工具。
要解决您的评论,可能是这样的:
aov_fun <- function(x,vars){
out <- vector("list",length(vars))
names(out) <- vars
f <- paste0(vars,"~Factors")
for (i in seq_along(vars)){
out[[i]] <- aov(as.formula(f[i]),data = x)
}
out
}
lapply(split(mydata,mydata$Years),aov_fun,vars = c('width','height'))