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)