1

可能重复:
在 R 中,两列之间的相关性测试,对于第三列中的每个组

我的数据框 (g) 包含 2 列包含连续数据和其他列包含分类数据。我想测试由第三列定义的不同组中的 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
4

3 回答 3

6

或者如果你使用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
于 2012-12-25T15:47:49.780 回答
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"])

于 2012-12-25T15:07:54.793 回答
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)))
于 2012-12-26T16:18:49.110 回答