这似乎应该是直截了当但我有一个数据框,需要提取id
之间每个可能的trial
对的分数相关性(换句话说,比较id的分数试验10中的1到试验10中的id 2,试验10中的id 1和试验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窒息。我在这里查看了论坛,并尝试使用comb
或outer
来解决这个问题,但对语法感到困惑。任何帮助将不胜感激!
答案 0 :(得分: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
答案 1 :(得分: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然后将结果转换为矩阵/数据框
HTH
答案 2 :(得分: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