查找数据帧的多行与同一数据帧中的另一多行之间的相关性

时间:2017-08-17 07:10:51

标签: r

样本数据集如下:

samp_data=data.frame(str=c(1,1,1,1,2,2,2,2,3,3,3,3),week=c(1,2,3,4,1,2,3,4,1,2,3,4),var1=c(1,3,4,1,1,3,1,1,1,1,1,1),var2=c(2,2,2,2,2,2,2,2,2,2,2,2))

> samp_data
   str week var1 var2
1    1    1    1    2
2    1    2    3    2
3    1    3    4    2
4    1    4    1    2
5    2    1    1    2
6    2    2    3    2
7    2    3    1    2
8    2    4    1    2
9    3    1    1    2
10   3    2    1    2
11   3    3    1    2
12   3    4    1    2

我想要做的是找到每个商店与数据框中每个其他商店的相关性,唯一的问题是每个商店都有多行。所以我想要的是这样的东西

require(energy)
DCOR(samp_data[samp_data$str==1,c("var1")],samp_data[samp_data$str==2,c("var1")])

$dCov
[1] 0.5303301

$dCor
[1] 0.5639143

$dVarX
[1] 1.179248

$dVarY
[1] 0.75

你可以看到我发现所有具有商店1的行与所有具有商店2的行之间的相关性。

我不想在这个练习中使用for循环,我想到了diag函数,但我想它是逐行计算的,有没有办法可以使用apply或类似的快节奏函数来做到这一点

2 个答案:

答案 0 :(得分:0)

您可以按照以下方式使用combn

combn(unique(samp_data$str), 2, function(i) 
        cor(samp_data$var1[samp_data$str == i[1]], samp_data$var1[samp_data$str == i[2]]))

答案 1 :(得分:0)

您还可以使用dplyrtidyr方式:

library(tidyverse)
samp_data %>% 
  select(str, var1) %>% 
  group_by(str) %>% 
  mutate(n=1:n()) %>% 
  spread(str, var1 ) %>% 
  select(-n) %>% 
  cor(.)
          1         2  3
1 1.0000000 0.3333333 NA
2 0.3333333 1.0000000 NA
3        NA        NA  1