2013-10-31 54 views
0

这看起来应该是直截了当的,但我有一个数据框,需要提取trial中每个可能的id对的分数的相关性(换句话说,比较ID为1的分数试验10至ID 2在试验10中,在试验10 ID 1至ID 3试验体10,等等。的示例数据帧如下。有效提取R中的成对相关性

id <- c('1','1','1','2', '2', '2', '3', '3', '3') 
trial <- c('10','11','12','10', '11', '12', '10', '11', '12') 
score<- c('634', '981','101', '621', '31', '124', '827', '404', '92') 
d <- data.frame(id, trial, score) 

d

id trial score 
    1 10 634 
    1 11 981 
    1 12 101 
    2 10 621 
    2 11 31 
    2 12 124 
    3 10 827 
    3 11 404 
    3 12 92 

结果应该是一个具有所有可能组合相关性的新矩阵。表面上它是评估整个ID的评分可靠性。

数据约为10000行,导致R窒息。我已经在这里看了论坛,并试图找出使用combouter但语法混淆。任何帮助将非常感激!

回答

1

基于@罗兰的想法,但使用R基本功能xtabs

> d$score <- as.numeric(as.character(d$score)) 
> cor(xtabs(score ~ trial + id, data=d)) 
      1   2   3 
1 1.00000000 -0.02568439 0.5295394 
2 -0.02568439 1.00000000 0.8344046 
3 0.52953942 0.83440458 1.0000000 
+1

以前从未使用过xtabs,这看起来很方便! – amurphy

0

达到此目的的一种方法可能是使用data.table。您可以使用以下内容

library(data.table) 
d.t <- data.table(d) 
setkey(d.t,"trial","id") 

然后像这样的东西应该有所帮助。

temp <- cor(as.vector(d.t[J("10","1")]$score),as.vector(d.t[J("10","2")]$score)) 

帖子这可以把一个循环解决此或sapply使用,然后将结果rbind成矩阵/数据帧

HTH

0

如果你没有太多的ID,我会在这里重塑数据,并使用cor接受data.frame作为输入:

d$score <- as.numeric(as.character(d$score)) 
library(reshape2) 
d1 <- dcast(d,trial~id) 
cor(d1[,-1]) 
#   1   2   3 
#1 1.00000000 -0.02568439 0.5295394 
#2 -0.02568439 1.00000000 0.8344046 
#3 0.52953942 0.83440458 1.0000000