比如我有以下数据
Cultivar=rep(c("CV1","CV2"),each=12)
Nitrogen=rep(rep(c("N0","N1","N2","N3"), each=3),2)
Block=rep(c("I","II","III"),8)
Yield=c (99, 109, 89, 115, 142, 133, 121, 157, 142, 125,
150, 139, 82, 104, 99, 117, 125, 127, 145, 154,
154, 151, 166, 175)
dataA=data.frame(Cultivar,Nitrogen,Block,Yield)
Cultivar Nitrogen Block Yield
1 CV1 N0 I 99
2 CV1 N0 II 109
3 CV1 N0 III 89
4 CV1 N1 I 115
5 CV1 N1 II 142
6 CV1 N1 III 133
7 CV1 N2 I 121
8 CV1 N2 II 157
9 CV1 N2 III 142
10 CV1 N3 I 125
11 CV1 N3 II 150
12 CV1 N3 III 139
13 CV2 N0 I 82
14 CV2 N0 II 104
15 CV2 N0 III 99
16 CV2 N1 I 117
17 CV2 N1 II 125
18 CV2 N1 III 127
19 CV2 N2 I 145
20 CV2 N2 II 154
21 CV2 N2 III 154
22 CV2 N3 I 151
23 CV2 N3 II 166
24 CV2 N3 III 175
我想对每个品种做方差分析。所以,我使用下面的代码:
ANOVA=aov(Yield~Nitrogen +factor(Block), data=subset(dataA, Cultivar=="CV1"))
summary(ANOVA)
貌似还可以,但是在我的实际数据中,我有30个品种,所以人工按品种分30次数据是不行的。我相信有一种方法可以自动分析每个品种的数据,而无需在 R.
中使用
subset()
你能告诉我怎么做吗?
谢谢!
你可以做
lapply()
treatment = unique(dataA$Cultivar)
lapply(treatment, \(x){
ANOVA=aov(Yield~Nitrogen +factor(Block), dataA[dataA$Cultivar == x,])
summary(ANOVA)
}) |>
setNames(treatment)
输出
$CV1
Df Sum Sq Mean Sq F value Pr(>F)
Nitrogen 3 3248 1082.7 19.14 0.00179 **
factor(Block) 2 1206 603.2 10.66 0.01059 *
Residuals 6 340 56.6
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
$CV2
Df Sum Sq Mean Sq F value Pr(>F)
Nitrogen 3 8486 2828.7 136.88 6.5e-06 ***
factor(Block) 2 546 273.0 13.21 0.00634 **
Residuals 6 124 20.7
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
为了让 YH 的答案更进一步,这类问题非常适合拆分、应用、合并方法。
splitdata <- split(dataA, dataA$Cultivar)
lapply(splitdata, function(df) {
ANOVA=aov(Yield~Nitrogen +factor(Block), data=df)
summary(ANOVA)
})