【问题标题】:Anova, for loop to apply functionAnova,for循环应用功能
【发布时间】:2011-10-01 01:27:47
【问题描述】:
>str(set)
'data.frame':   1000 obs. of  6 variables:
$ ID       : Factor ..
$ a : Factor ..
$ b: Factor ..
$ c: Factor ..
$ dat    : num  ..
$ contrasts : Ord.factor ..


>X
[1] "a"  "b" "c" 


for (i in 1 :length(X) ){
  my=X[i]
  f=as.formula(paste("dat~contrasts*", paste(my,"Error(ID/(contrasts))",sep="+")))
  sum = summary( aov (f, data =set))
}

X 可能非常大,所以考虑使用应用函数而不是 for 循环。在这种情况下可能吗?

我试过了:

apply(
  as.matrix(X), 1, function(i){
    summary(aov(as.formula(paste("dat~contrasts*",
      paste(i, "Error(ID/(contrasts))", sep="+"))), data=set))
  }
)

但这没有任何意义。谁能帮帮我?

【问题讨论】:

  • 如果X 是一个向量,那么sapply 更合适,但这本质上只是一种更好的方式来编写你的for循环,它实际上不会加速你的代码。
  • @Ashley :很高兴您提供了 str() 信息,但如果您给我们一些玩具数据集来玩会更好。另见stackoverflow.com/questions/5963269/…

标签: r loops for-loop apply anova


【解决方案1】:

应该这样做:

# Sample data
set <- data.frame(ID=1:10, a=letters[1:10], b=LETTERS[1:10], c=letters[10:1],
                  dat=runif(10), contrasts=ordered(rep(1:2, 5)))
X <- letters[1:3] # a,b,c

sapply(X, function(my) {
  f <- as.formula(paste("dat~contrasts*",my,"+Error(ID/(contrasts))"))
  summary(aov(f, data=set))
}, simplify=FALSE)

请注意 sapply 与 simple=FALSE 一起使用。使用 lapply 也可以,但它不会将名称添加到列表组件中。

【讨论】:

  • @ashley:如果答案是你需要的,你应该标记为答案。您还应该投票赞成您喜欢的答案(和问题)。只需点击左上角的分数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-18
  • 2019-12-21
  • 2017-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多