2011-07-08 52 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