R 重塑相关矩阵,仅包括每对变量一次

R 重塑相关矩阵,仅包括每对变量一次,r,R,我有一张这样的桌子: A B C D E 7 1 6 8 7 9 3 9 5 9 4 6 2 1 10 10 5 3 4 1 1 3 5 9 3 6 4 8 7 6 我正在寻找每个变量与表中每个其他变量的相关性。这是我使用的R代码: test <- read.csv("D:/AB/test.csv") iterations <- ncol(test) correlation

我有一张这样的桌子:

A   B   C   D   E
7   1   6   8   7
9   3   9   5   9
4   6   2   1   10
10  5   3   4   1
1   3   5   9   3
6   4   8   7   6
我正在寻找每个变量与表中每个其他变量的相关性。这是我使用的R代码:

test <- read.csv("D:/AB/test.csv")
iterations <- ncol(test)
correlation <- matrix(ncol = 3 , nrow = iterations * iterations)
for (k in 1:iterations) {
  for (l in 1:iterations){
    corr <- cor(test[,k], test[,l])
    corr_string_A <- names(test[k])
    corr_string_B <- names(test[l])
    correlation[l + ((k-1) * iterations),] <- rbind(corr_string_A, corr_string_B, corr)        
  }
}
但是,我不想要上面三角形的值;i、 例如,不应出现对角线值,并且每个唯一的组合只应出现一次。最终输出应如下所示:

   Var1 Var2       value
1     B    A  0.50018605
2     C    A -0.35747393
3     D    A -0.25670054
4     E    A -0.02974821
5     C    B  0.56070716
6     D    B  0.46164928
7     E    B  0.16813991
8     D    C  0.52094589
9     E    C  0.23190036
10    E    D -0.39223227
我知道有一些技术可以实现上述输出,比如重塑,但是我想让上面的R代码适合并产生上述结果

我相信第二个for循环中的“n”应该动态地改变,这有助于实现这一点。但是,我不确定如何进行此操作。

使用
as.data.frame
as.table
将相关矩阵转换为3列格式,然后使用
子集
可以限制对角线上方或下方的值

subset(as.data.frame(as.table(cor(dat))),
       match(Var1, names(dat)) > match(Var2, names(dat)))
#    Var1 Var2        Freq
# 2     B    A -0.02299154
# 3     C    A  0.23155350
# 4     D    A -0.28036851
# 5     E    A -0.05230260
# 8     C    B -0.58384036
# 9     D    B -0.80175393
# 10    E    B  0.00000000
# 14    D    C  0.52094589
# 15    E    C  0.23190036
# 20    E    D -0.39223227
请注意,对于较大的数据集,这应该比单独调用变量对上的
cor
效率更高,因为
cor
是矢量化的,而且显然键入要少得多

如果您确实必须保留循环代码,则只需对for循环对进行小的更改,并对您正在计算的
相关性
行进行一些簿记,即可获得所需的结果:

iterations <- ncol(test)
correlation <- matrix(ncol = 3 , nrow = choose(iterations, 2))
pos <- 1
for (k in 2:iterations) {
  for (l in 1:(k-1)){
    corr <- cor(test[,k], test[,l])
    corr_string_A <- names(test[k])
    corr_string_B <- names(test[l])
    correlation[pos,] <- rbind(corr_string_A, corr_string_B, corr)        
    pos <- pos+1
  }
}

iterations从OP的循环输出,我们可以对行进行子集

df1[!duplicated(t(apply(df1[1:2], 1, sort))) & df1[,1]!=df1[,2],]
#   Var1 Var2       value
#2     B    A  0.50018605
#3     C    A -0.35747393
#4     D    A -0.25670054
#5     E    A -0.02974821
#8     C    B  0.56070716
#9     D    B  0.46164928
#10    E    B  0.16813991
#14    D    C  0.52094589
#15    E    C  0.23190036
#20    E    D -0.39223227
或者正如我在评论中提到的(首先),使用

cor(test)

你就不能做
cor(test)
。我想,从您的输出来看,
correlation[with(correlation,Var1!=Var2),]
第二个例子在
?cor
…@akrun-谢谢。但由于某些特定的工作目的,上述R代码将适合我,而不是cor(测试)或重塑函数等。我无法理解您适应重塑的原因,或者Josilbern提供的关于“我面临的最大问题是对角线值和成对重复”的答案:
m
cor(test)