遍历列并比较R中具有相似名称的列

时间:2019-06-13 09:18:15

标签: r loops multiple-columns

我再次询问有关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

有什么知道怎么做吗?

非常感谢!

1 个答案:

答案 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