可能重复:
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
答案 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)))