2014-05-07 68 views
0

這裏是什麼我數據看起來像一個例子:在R或foreach循環與杜克的測試比較

metabolite treatment area 
x   A   1 
x   B   2 
x   C   3 
y   A   4 
y   B   5 
y   C   6 
z   A   7 
z   B   8 
z   C   9 
x   A   12 
x   B   22 
x   C   32 
y   A   42 
y   B   52 
y   C   62 
z   A   72 
z   B   82 
z   C   92 

爲每個代謝,我想測試的治療的平均面積是否不同。 換句話說:

代謝物X:A與B,A與C,B對丙 代謝ÿ:A與B,A與C,B對丙 代謝物Z:A對B,A對C,B對C

我需要在R中進行Tukey測試(http://en.wikipedia.org/wiki/Tukey%27s_range_test),這將使得處理的每個成對比較(A對B,A對C和C對B)。這是我想到的,但它不起作用。

`for (i in levels(data$metabolite)) { 
tukey_part1 <- aov(data$area ~ data$treatment) 
tukey_part2 <- TukeyHSD(x=tukey_part1, 'data$treatment', conf.level=0.95) 
          } ` 

請幫忙!

回答

1

那麼,你從來沒有嘗試過使用你正在循環的i變量。我繼續並將for循環改爲使用lapply代替。如何

res<-lapply(levels(data$metabolite), function(i) { 
    met<-data[data$metabolite==i, ] #subset for metabolite i 
    part1<-with(met, aov(area ~ treatment)) 
    print(part1) 
    list( 
     part1 = part1, 
     part2 = TukeyHSD(x=part1, 'treatment', conf.level=0.95) 
    ) 
}) 
names(res)<-levels(data$metabolite) 

這會給你一個列表或列表,其中包含您正在尋找的部分。例如,您可以使用res[[_metabolite_]][[_part_]]提取結果,例如...

res[["x"]][["part1"]] 
res[["y"]][["part2"]]