2015-02-10 65 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