2015-02-10 30 views
0

下面是一個可用的R腳本。我想要anova數據幀dfa然後dfb - 但 aov函數只讀取第一個數據幀。我已經搜索,但沒有找到解決方案。腳本比計算效率更容易閱讀。 如何讓aov循環訪問數據框? 在此先感謝。R looping anova並從列表中挑選數據框名稱

#two dummy data frames 
Obs <- c(1,2,1,4,5,6) ;Treat <- c(1,1,1,2,2,2) 
dfa <- data.frame(Obs=Obs, Treat=Treat) 
Obs2 <- c(10,22,10,43,52,60) 
dfb <- data.frame(Obs=Obs2, Treat=Treat) 
Names <- c("dfa","dfb") 

# Loop here but cannot get it to work with calling data frame names just repeats first analysis - dfb has quite different values 
for(i in 1:2) { 
print(summary(aov(Obs ~ Treat, data=as.data.frame(Names[i])))) 
print(Names[i]) 
} 
+0

另外,在您的代碼中,值會在您創建Obs' Treat'對象時重複。結果可能來自'summary(aov(Obs〜Treat))的輸出'假設你創建了數據集而不創建矢量對象'dfa < - data.frame(Obs = c(1,2,1,4,5) ,6),Treat = c(1,1,1,2,2,2)); dfb < - data.frame(Obs = c(10,22,10,43,52,60),Treat = c(1,1,1,2,2,2))'運行循環時,'Error in eval(expr,envir,enclos):找不到對象'Obs' – akrun 2015-02-10 12:38:56

+0

哇,這是不同的!無論如何,'函數'和'lapply'都起作用,並且我還將變量名稱更改爲更加獨特的名稱。 – 2015-02-10 14:11:27

+0

對不起 - 我忘了 - 非常感謝!現在我將嘗試使用這些知識。 – 2015-02-10 14:18:54

回答

0

你可以嘗試要麼

Map(function(x) summary(aov(Obs~Treat,data=x)) , mget(Names)) 

或者

lapply(mget(Names), function(x) summary(aov(Obs~Treat, data=x))) 

如果你需要一個功能,在 「呼叫」 公式也改變了 「數據」。

f1 <- function(formula= as.formula('Obs~Treat'), data, ...){ 
    Call <- match.call(expand.dots=TRUE) 
    Call[[1]] <- as.name('aov') 
    Call$formula <- as.formula(terms(formula)) 
    Call$data <- as.symbol(substitute(nm, list(nm=data))) 
    eval(Call) 
    } 

    Map(function(x,y) f1(data=y), mget(Names), Names) 
    #$dfa 
    #Call: 
    #aov(formula = Obs ~ Treat, data = dfa) 

    #Terms: 
    #     Treat Residuals 
    #Sum of Squares 20.166667 2.666667 
    #Deg. of Freedom   1   4 

    #Residual standard error: 0.8164966 
    #Estimated effects may be unbalanced 

    #$dfb 
    #Call: 
    #aov(formula = Obs ~ Treat, data = dfb) 

    #Terms: 
    #     Treat Residuals 
    # Sum of Squares 2128.1667 240.6667 
    #Deg. of Freedom   1   4 

    #Residual standard error: 7.756718 
    #Estimated effects may be unbalanced 
相關問題