2015-02-10 4 views
0

Ниже приведен рабочий сценарий R. Я хочу anova data frames dfa, а затем dfb - но функция aov только считывает первый фрейм данных. Я искал, но не нашел решение. Более важно, чтобы сценарий был легко читаемым, чем эффективность вычислений. Как я могу сделать aov для прокрутки кадров данных? Спасибо заранее.R петля 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)) 'После запуска вашего цикла,' Ошибка в eval (expr, envir, enc): объект 'Obs' не найден – akrun

+0

Ничего себе, это было иначе! В любом случае работают как «функция», так и «lapply», а также меняются имена переменных на более уникальные имена. –

+0

Извините, я забыл - большое спасибо! Теперь я попытаюсь использовать это знание. –

ответ

0

Вы можете попробовать либо

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

Или

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

Если вам нужна функция, которая также изменяет "данные" в "Call" формулы.

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 
Смежные вопросы