1

我试图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 次方差分析 - 比较 5 年中每一年的因子水平 1 和 2 之间的差异。实际上,我的数据有 8 年和 5 个因子水平。我还将对几个变量(如宽度和高度)进行这些方差分析。

4

1 回答 1

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'))
于 2013-08-19T16:43:44.350 回答