我再次询问有关R中的列遍历的问题。我具有成对的数据,如下所示:
a1.x a2.x a3.x a1.y a2.y a3.y
2 1 2 2 3 2
1 1 3 2 2 3
4 2 2 1 2 4
实际上,我有45对这样的对,我想计算t检验,计算其他事情,并将每对的值保存在一张表中。因此,我想知道是否可以编写一个循环来做到这一点。
我尝试过以下操作:
name <-colnames(df[1:45])
name <-gsub(".x", "", name)
for (i in name){
value.x <- paste0(i,".x")
value.y <-paste0(i,".y")
t.dmean <- with(df,t.test(value.x, value.y, var.equal = FALSE))
m.case <-mean(value.x)
sd.case <-sd(value.x)
m.ctl <- mean(value.y)
sd.ctl <- sd(value.y)
d <-(m.case-m.ctl)/sqrt((sd.case^2+sd.ctl^2)/2)
out <-rbind(out, cbind(i,paste0(t.dmean$p.value), m.case, sd.case, m.ctl, sd.ctl, d))
}
我希望桌子是这样的
scale p_value m.case sd.case m.ctl sd.ctl d
al 0.06 1.1 0.15 1.6 0.5 0.65
a2 0.07 2.1 0.20 2.2 0.10 0.33
a3 0.08 1.3 0.21 1.4 0.2 0.40
但这不起作用...出现错误消息
Error in t.test.default(value.x, value.y, var.equal = FALSE) :
not enough 'x' observations
In addition: Warning messages:
1: In mean.default(x) : argument is not numeric or logical: returning NA
2: In var(x) : NAs introduced by coercion
有什么知道怎么做吗?
非常感谢!
答案 0 :(得分:1)
我们可以创建一个函数,并从每组列中返回所需的所有统计信息。
get_statistics <- function(df) {
p_val <- t.test(df)$p.value
m.case <-mean(df[[1]])
sd.case <-sd(df[[1]])
m.ctl <- mean(df[[2]])
sd.ctl <- sd(df[[2]])
d <-(m.case-m.ctl)/sqrt((sd.case^2+sd.ctl^2)/2)
c(p_val = p_val, m.case = m.case, sd.case = sd.case, m.ctl = m.ctl,
sd.ctl = sd.ctl, d = d)
}
,然后使用split.default
按列名拆分列并应用函数。
t(sapply(split.default(df, sub("\\..*", "", names(df))), get_statistics))
# p_val m.case sd.case m.ctl sd.ctl d
#a1 0.006566 2.33 1.528 1.67 0.577 0.577
#a2 0.001894 1.33 0.577 2.33 0.577 -1.732
#a3 0.000493 2.33 0.577 3.00 1.000 -0.816