【问题标题】:Correlation between measurements by group各组测量值之间的相关性
【发布时间】:2017-11-22 12:14:26
【问题描述】:

我有一个数据框,其中包含由不同评估者进行的测量,我想计算评估者之间测量的相关性。

这是我当前使用虚拟数据的实现:

set.seed(123)
df <- data.table(
groups = rep(seq(1, 4, 1),100),
measurement = runif(400)
)

cormat <- matrix(ncol=length(unique(df$groups)), nrow=length(unique(df$groups)))

for (i in unique(df$groups)){
    for (j in unique(df$groups)){

    cormat[i,j] <- cor(df[groups==i,]$measurement, df[groups==j,]$measurement)
}}

我讨厌上面的嵌套循环,并且希望最好找到一个 dplyr/tidyverse 来解决我的问题。

预期的输出是:

> cormat
           [,1]        [,2]        [,3]        [,4]
[1,]  1.0000000 -0.10934904 -0.15159825  0.13237094
[2,] -0.1093490  1.00000000 -0.04278137 -0.02945215
[3,] -0.1515983 -0.04278137  1.00000000  0.04203516
[4,]  0.1323709 -0.02945215  0.04203516  1.00000000

(抱歉,如果之前有人问过这个问题,我正在努力寻找一个好的搜索词)

【问题讨论】:

标签: r dplyr tidyverse


【解决方案1】:

这是tidyverse 方法。

library(tidyverse)
df %>% 
 arrange(groups) %>% 
 add_column(index = rep(1:100, times = 4)) %>% 
 spread(groups, measurement) %>% 
 select(-index) %>% 
 cor()

结果

           1           2           3           4
1  1.0000000 -0.10934904 -0.15159825  0.13237094
2 -0.1093490  1.00000000 -0.04278137 -0.02945215
3 -0.1515983 -0.04278137  1.00000000  0.04203516
4  0.1323709 -0.02945215  0.04203516  1.00000000

我们需要索引列具有唯一标识符才能传播数据。


编辑

base R 方法可能是

cor(unstack(df, measurement ~ groups))

【讨论】:

  • 这是完美的。谢谢!
猜你喜欢
  • 1970-01-01
  • 2017-01-11
  • 2018-06-09
  • 1970-01-01
  • 2012-12-29
  • 1970-01-01
  • 1970-01-01
  • 2021-01-19
  • 2020-05-28
相关资源
最近更新 更多