R 多数据帧上的方差分析重复测量

R 多数据帧上的方差分析重复测量,r,for-loop,anova,R,For Loop,Anova,我有数百个数据帧。我需要对每个数据帧执行方差分析RM测试。输出应为单个数据帧,每个p值的平均值 我试过: #crate dataframes df1 <- data.frame(replicate(16,sample(-10:10,10,rep=TRUE))) df2 <- data.frame(replicate(16,sample(-10:10,10,rep=TRUE))) df3 <- data.frame(replicate(16,sample(-10:10,10,re

我有数百个数据帧。我需要对每个数据帧执行方差分析RM测试。输出应为单个数据帧,每个p值的平均值

我试过:

#crate dataframes
df1 <- data.frame(replicate(16,sample(-10:10,10,rep=TRUE)))
df2 <- data.frame(replicate(16,sample(-10:10,10,rep=TRUE)))
df3 <- data.frame(replicate(16,sample(-10:10,10,rep=TRUE)))
Group <- c(rep("A",8),rep("B",8))
Time <- c(rep("before",4),rep("after",4),rep("before",4),rep("after",4))
Name <- rep(rep(1:4, 4))
conds <- data.frame(Name,Time,Group)
#create list
list <- list(df1,df2,df3)

#for loop ANOVA repeated measures
for ( i in list){
  data <- cbind(conds,i)
  t=NULL
  name <- colnames(data)[4:ncol(data)]
  for(i in 4:ncol(data)) { z <- aov(data[,i] ~ Group*Time+Error(Name/(Group*Time)), data=data) 
  sz <- as.list(summary(z))
  t <- as.data.frame(c(t,sz[4]$`Error: Name:Group:Time`[[1]]$`Pr(>F)`[1]))
  t
  }
}
mean(t)
#板条箱数据帧

df1R作为一种矢量化语言,旨在尽可能避免
for
循环。你可以用
sapply
的方法

当您列出数据帧时,请使用类似于
df1=
的名称,这将有助于后面的
res
ult中的哪些帧已完成计算

(不要使用
列表
作为对象名称,因为还有一个
列表
函数,这会让你感到困惑。另外
数据
df
和朋友都是“坏”名称,如果名称已经被占用,你可以使用例如
列表
来检查。)


数据:

set.seed(42)

df1只是好奇:我从您的代码和@Giffredo的代码中得到了相同的错误消息:
数据中的错误。frame(…,check.names=FALSE):参数意味着不同的行数:16,10,因为
conds
的行长和列表中的
df
s的行长不一样。你没有收到这个错误消息吗?@DominikS.Meier是的,对不起,瑞士有一场小雷雨,我想添加我使用的数据。实际上,
cond
df*
的行号必须相等。看更新的答案。啊,好的。不用担心,我们在巴塞尔也有类似的天气。@jay.sf非常感谢您对R和您创建的脚本的建议!
list1 <- list(df1=df1, df2=df2, df3=df3)

res <- sapply(list1, function(x) {
  dat <- cbind(conds, x)
  sapply(dat[-(1:3)], function(y) {
    z <- aov(y ~ Group*Time + Error(Name/(Group*Time)), data=dat)
    sz <- summary(z)
    p <- sz$`Error: Name:Group:Time`[[1]][1, 5]
    p
  })
})
colMeans(res)
#       df1       df2       df3 
# 0.4487419 0.4806528 0.4847789
set.seed(42)
df1 <- data.frame(replicate(16,sample(-10:10,16,rep=TRUE)))
df2 <- data.frame(replicate(16,sample(-10:10,16,rep=TRUE)))
df3 <- data.frame(replicate(16,sample(-10:10,16,rep=TRUE)))
conds <- data.frame(Name=c(rep("A",8),rep("B",8)), 
                    Time=c(rep("before",4),rep("after",4),
                           rep("before",4),rep("after",4)),
                    Group=rep(1:4, 4))