在R中,对于第三列中的每个组,在两列之间进行相关性测试

时间:2012-12-25 13:17:02

标签: r

  

可能重复:
  In R, correlation test between two columns, for each of the groups in a third column

我的数据框(g)包含2列连续数据,其他列包含分类数据。我想测试两个连续变量之间的相关性,在第三列定义的不同组中。 g(157X3000)看起来像:

     Geno          GDW         GN        M1     M2      M3
1 SB002XSB012 -17.1597630   52.31961    G/G    C/C     T/T
3 SB002XSB044  -3.6537657   53.81305    G/G    C/G     G/G
4 SB002XSB051  -7.8411596   58.05924    A/G    C/C     G/T
5 SB002XSB067   2.8412103   30.85074    A/G    G/G     G/T
6 SB002XSB073 -16.0789550  -10.09913    A/A    C/G     G/G
7 SB002XSB095   0.1759709   10.28837    A/A    G/G     T/T

我正在寻找每个M.所定义的每个组中GDW和GN之间的相关性。我试过:

q<- function (x) {  
    spl<-split(g[,2:3],x)  
    r<-function(x) { 
        if ((nrow(x[[1]][1]))>2)  
          cor.test(x[[1]][1],x[[1]][2],use="pairwise.complete.obs")[3:4] else Na  
    }  
    cor<- sapply(spl,r)  
} 

all.cor<- apply(g[,4:ncol(g)],2,q)

得到了:

Error in if ((nrow(x[[1]][1])) > 2) cor.test(x[[1]][1], x[[1]][2], use = "pairwise.complete.obs")[3:4] else Na : 
  argument is of length zero

3 个答案:

答案 0 :(得分:5)

或者如果您使用plyr包,您可以说(复制Antoine的样本数据)

library(plyr)
g <- data.frame(col1=rnorm(100, 1, 1), col2=rnorm(100, 10, 3), col3=c(rep("a", 50), rep("b", 50)))

co <- ddply(g, .(col3), function(adf) cor(adf[,1], adf[,2]))

给data.frame看起来像......

    col3         V1
  1    a -0.1697979
  2    b  0.1660783

编辑:为多列添加循环 * EDIT2:删除可笑的复杂表达! *

library(plyr)
g <- data.frame(col1=rnorm(100, 1, 1),
            col2=rnorm(100, 10, 3),
            col3=sample(c('a','b','c'), 100, replace=TRUE),
            col4=sample(c('a','b','c'), 100, replace=TRUE),
            col5=sample(c('a','b','c'), 100, replace=TRUE),
            col6=sample(c('a','b','c'), 100, replace=TRUE))
for (i in 3:6) {
  co <- ddply(g, i, function(adf) cor(adf[,1], adf[,2]))
  names(co) <- c('variable',paste('CorCol',i, sep='-'))
  if(exists('odf')) { 
    odf <- merge(odf, co, by='variable', all=TRUE)
  } else {
    odf <- co
  } 
} 

结果在data.frame odf中,每个相关的列都如下所示:

> odf
  variable    CorCol-3    CorCol-4    CorCol-5    CorCol-6
1        a  0.29596471 -0.12278082  0.02184259  0.11972933
2        b -0.11793616  0.08827011  0.11030097 -0.03682823
3        c -0.09552299  0.12951251 -0.03855727 -0.03082486

答案 1 :(得分:2)

您可以使用for循环轻松完成(除非您的分类列中包含非常多的级别,否则这应该可以正常工作)。

下面是一段代码片段,应该很容易适应您的数据(您只需要更改列的名称,使它们与数据框中的列相对应):

g <- data.frame(col1=rnorm(100, 1, 1), col2=rnorm(100, 10, 3), col3=c(rep("a", 50), rep("b", 50)))

co <- c()
for (i in levels(g$col3)){
    tmp <- cor(g[g[,"col3"]==i,"col1"], g[g[,"col3"]==i,"col2"])
    co <- c(co, tmp)
}

co对象包含数据框的相关性,其中级别显示在levels(g[,"col3"])中,其中包含分类变量。

答案 2 :(得分:1)

对于玩具数据框

g <- data.frame(col1=rnorm(100, 1, 1), 
                col2=rnorm(100, 10, 3), 
                col3=gl(2, 50),
                col4=gl(4, 25))

我认为这是最简单的方法:

by(g, g$col3, function(x) cor(x$col1, x$col2))

对于几个列也是如此:

for (i in 3:ncol(g)) print(by(g, g[i], function(x) cor(x$col1, x$col2)))