0

这看起来应该很简单,但我有一个数据框,需要提取每个可能的id跨对的分数的相关性trial(换句话说,比较试验 10 上的 id 1 与试验 10 上的 id 2 的分数,id 1从试验 10 到试验 10 的 id 3,依此类推。示例数据帧如下。

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 阻塞。我在这里的论坛中查看并尝试使用comborouter但对语法感到困惑。任何帮助将非常感激!

4

3 回答 3

1

基于@Roland 的想法,但使用 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
于 2013-10-31T10:09:56.333 回答
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 将结果放入矩阵/数据框

高温高压

于 2013-10-31T07:44:51.137 回答
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
于 2013-10-31T08:14:42.830 回答