在R中的for循环中使用字符串 - 在for循环中将字符串作为变量包含在ANOVA中时出错

时间:2014-11-26 12:50:27

标签: r for-loop anova

我在R中有以下ANOVA,效果很好:

fit <- aov(dependent1 ~ X + Z + X*Z, data=dataset)
drop1(fit,~.,test="F")

“dependent1”,“X”和“Z”是列名。

我想创建一个for循环,我遍历一定数量的因变量,我尝试了这个:

dependent_variables <- c("dependent1", "dependent2", "dependent3")

for (i in dependent_variables) {
  fit <- aov(i ~ X + Z + X*Z, data=dataset)
  drop1(fit,~.,test="F")
}

如果我运行此命令,则会收到错误消息:

Error in model.frame.default(formula = i ~ X + Z + X *  : 
  variable lengths differ (found for 'X')

知道这里出了什么问题吗?

2 个答案:

答案 0 :(得分:1)

为什么不循环访问数据而不是循环遍历名称?也许这比你想要做的更有点笨拙。

创建数据

dependent1 = runif(100);
dependent2 = runif(100);
dependent3 = runif(100);
dataset = data.frame(X=1:100, Z=rnorm(1,1,100))

运行单一方差分析

fit = aov(dependent1 ~ X + Z + X*Z, data=dataset)
drop1(fit,~.,test="F")

将依赖者绑定在一起并循环遍历它们,将结果存储在列表对象中

d = cbind(dependent1, dependent2, dependent3)
fit = list(); drop = list()

for (i in 1:ncol(d)) {
  fit[[i]] = aov(d[,i] ~ X + Z + X*Z, data=dataset)
  drop[[i]] = drop1(fit[[i]],~.,test="F")
}

**已修改:名为fit而不是fit[[i]]。对不起。

答案 1 :(得分:1)

示例数据(可能符合也可能不符合ANOVA的标准)

X <- rnorm(100)
Z <- rnorm(100)
dependent1 <- rnorm(100)
dependent2 <- rnorm(100)
dependent3 <- rnorm(100)

dataset <- cbind(data.frame(X, Z, dependent1, dependent2, dependent3))

以下脚本可以使用,您需要在因变量的行列号中输入:

for (i in 3:5) {
fit <- aov(dataset[ , i] ~ X + Z + X*Z, data=dataset)
drop <- drop1(fit,~.,test="F")
print(fit)
print(drop)
}