gpt4 book ai didi

reshape 相关矩阵,每对变量仅包含一次

转载 作者:行者123 更新时间:2023-12-01 09:20:22 25 4
gpt4 key购买 nike

我有一张这样的 table :

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)
}
}

以下是我收到的输出:

   Var1 Var2       value
1 A A 1.00000000
2 B A 0.50018605
3 C A -0.35747393
4 D A -0.25670054
5 E A -0.02974821
6 A B 0.50018605
7 B B 1.00000000
8 C B 0.56070716
9 D B 0.46164928
10 E B 0.16813991
11 A C -0.35747393
12 B C 0.56070716
13 C C 1.00000000
14 D C 0.52094589
15 E C 0.23190036
16 A D -0.25670054
17 B D 0.46164928
18 C D 0.52094589
19 D D 1.00000000
20 E D -0.39223227
21 A E -0.02974821
22 B E 0.16813991
23 C E 0.23190036
24 D E -0.39223227
25 E E 1.00000000

但是,我不想要上三角形的值;即,不应该出现对角线值,并且每个唯一组合应该只出现一次。最终输出应如下所示:

   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

我知道有一些技术,如 reshape 使用可以实现上述输出,但我想让上述 R​​ 代码适应并产生上述结果。

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

最佳答案

You can使用 as.data.frameas.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 循环对进行微小更改并记录您正在计算的 correlation 行来实现您想要的结果:

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
}
}

但是我真的不建议使用这种循环解决方案;最好使用我提供的单线,然后处理所有生成的 NA 值。

关于 reshape 相关矩阵,每对变量仅包含一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34209094/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com