2011-07-08 47 views
4
>str(set) 
'data.frame': 1000 obs. of 6 variables: 
$ ID  : Factor .. 
$ a : Factor .. 
$ b: Factor .. 
$ c: Factor .. 
$ dat : num .. 
$ contrasts : Ord.factor .. 


>X 
[1] "a" "b" "c" 


for (i in 1 :length(X)){ 
    my=X[i] 
    f=as.formula(paste("dat~contrasts*", paste(my,"Error(ID/(contrasts))",sep="+"))) 
    sum = summary(aov (f, data =set)) 
} 

X可以是非常巨大的,所以想到了一个应用函数,而不是for-loop.Is它可能在这种情况下?Anova,for循环应用函数

我尝试这样做:

apply(
    as.matrix(X), 1, function(i){ 
    summary(aov(as.formula(paste("dat~contrasts*", 
     paste(i, "Error(ID/(contrasts))", sep="+"))), data=set)) 
    } 
) 

但是,这是没有意义的。谁能帮我?

+3

如果'X'是一个向量,那么'sapply'更合适,但这实际上只是编写for循环的一个更好的方法,它实际上并不会加快代码的速度。 –

+1

@Ashley:不错,你把str()的信息,但如果你给我们一些玩具数据集来玩,它会更好。另请参阅http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example –

回答

3

这应该做到这一点:

# Sample data 
set <- data.frame(ID=1:10, a=letters[1:10], b=LETTERS[1:10], c=letters[10:1], 
        dat=runif(10), contrasts=ordered(rep(1:2, 5))) 
X <- letters[1:3] # a,b,c 

sapply(X, function(my) { 
    f <- as.formula(paste("dat~contrasts*",my,"+Error(ID/(contrasts))")) 
    summary(aov(f, data=set)) 
}, simplify=FALSE) 

的使用注意事项与简化= FALSE sapply的。使用lapply也可以,但它不会将名称添加到列表组件。

+0

@ashley:如果答案是你所需要的,你应该标记为答案。你也应该提高你喜欢的答案(和问题)。只需点击左上角的分数。 – Tommy