样本数据集如下:
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或类似的快节奏函数来做到这一点
答案 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)
您还可以使用dplyr
和tidyr
方式:
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