1

重複の可能性:
Rでは、3番目の列のグループごとに2つの列間の相関テスト

私のデータフレーム(g)には、連続データを含む2つの列と、カテゴリデータを含む他の列が含まれています。3番目の列で定義された異なるグループで、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

編集: 複数の列のループを追加 *編集2: とてつもなく複雑な式を削除! *

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 に答える