R中的系统列表索引

时间:2011-11-08 08:41:33

标签: r

我要从ANOVA表列表中提取F Value

tear <- c(6.5, 6.2, 5.8, 6.5, 6.5, 6.9, 7.2, 6.9, 6.1, 6.3,
      6.7, 6.6, 7.2, 7.1, 6.8, 7.1, 7.0, 7.2, 7.5, 7.6)
gloss <- c(9.5, 9.9, 9.6, 9.6, 9.2, 9.1, 10.0, 9.9, 9.5, 9.4,
       9.1, 9.3, 8.3, 8.4, 8.5, 9.2, 8.8, 9.7, 10.1, 9.2)
opacity <- c(4.4, 6.4, 3.0, 4.1, 0.8, 5.7, 2.0, 3.9, 1.9, 5.7,
         2.8, 4.1, 3.8, 1.6, 3.4, 8.4, 5.2, 6.9, 2.7, 1.9)
Y <- cbind(tear, gloss, opacity)
rate <- factor(gl(2,10), labels=c("Low", "High"))
additive <- factor(gl(2, 5, length=20), labels=c("Low", "High"))

fit <- manova(Y ~ rate * additive)
summary.aov(fit)

我可以使用以下代码完成任务:

summary.aov(fit)[[1]][-4,4]
summary.aov(fit)[[2]][-4,4]
summary.aov(fit)[[3]][-4,4]

我想知道是否有这样的方式

summary.aov(fit)[[1:3]][-4,4]

以更优雅的方式完成任务。感谢

2 个答案:

答案 0 :(得分:4)

在包含数字向量的列表中使用sapply,即1:3

sapply(1:3, function(i) summary.aov(fit)[[i]][-4,4])
             [,1]     [,2]      [,3]
[1,] 15.786848073 7.917808 0.1036289
[2,]  6.897959184 3.729072 1.2076890
[3,]  0.004535147 3.315068 0.9760335

您还可以使用sapply作为列表summary.aov直接访问变量。 F值是一个命名元素F value - 它包含一个空格,所以要索引它你必须用反引号包装它:

sapply(summary.aov(fit), function(x) x$`F value`)

      Response tear  Response gloss  Response opacity
[1,]   15.786848073        7.917808         0.1036289
[2,]    6.897959184        3.729072         1.2076890
[3,]    0.004535147        3.315068         0.9760335
[4,]             NA              NA                NA

答案 1 :(得分:2)

对于此类任务,*apply系列函数是您的朋友:

sapply(summary.aov(fit), "[", -4, 4)

这并不是很明显,但“[”是在R中使用[]后面真正落后的函数(它的第一个参数是你想要子集的对象 - 见?"["),其他参数是也传递给了这个函数。 作为不需要这种知识的替代方案:

sapply(summary.aov(fit), function(cursummary){cursummary[-4,4]})