Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 将相关性显示为有序列表,而不是大型矩阵_R - Fatal编程技术网

R 将相关性显示为有序列表,而不是大型矩阵

R 将相关性显示为有序列表,而不是大型矩阵,r,R,我有一个100多列的数据框。cor()返回速度非常快,但告诉我的太多了,特别是因为大多数列都不相关。我想让它告诉我列对和它们的相关性,理想的顺序 如果这不合理,这里有一个人为的例子: df = data.frame(a=1:10,b=20:11*20:11,c=runif(10),d=runif(10),e=runif(10)*1:10) z = cor(df) z看起来像这样: a b c d

我有一个100多列的数据框。cor()返回速度非常快,但告诉我的太多了,特别是因为大多数列都不相关。我想让它告诉我列对和它们的相关性,理想的顺序

如果这不合理,这里有一个人为的例子:

df = data.frame(a=1:10,b=20:11*20:11,c=runif(10),d=runif(10),e=runif(10)*1:10)
z = cor(df)
z看起来像这样:

           a          b           c           d          e
a  1.0000000 -0.9966867 -0.38925240 -0.35142452  0.2594220
b -0.9966867  1.0000000  0.40266637  0.35896626 -0.2859906
c -0.3892524  0.4026664  1.00000000  0.03958307  0.1781210
d -0.3514245  0.3589663  0.03958307  1.00000000 -0.3901608
e  0.2594220 -0.2859906  0.17812098 -0.39016080  1.0000000
我想要的是一个函数,它会告诉我:

a:b -0.9966867 
b:c  0.4026664
d:e -0.39016080  
a:c -0.3892524 
b:d  0.3589663
a:d -0.3514245 
b:e -0.2859906
a:e  0.2594220 
c:e  0.17812098
c:d  0.03958307
我有一个简单的方法来消除一些噪音:

z[abs(z)<0.5]=0
库(重塑)
z[z==1]我总是使用

zdf <- as.data.frame(as.table(z))
zdf
#    Var1 Var2     Freq
# 1     a    a  1.00000
# 2     b    a -0.99669
# 3     c    a -0.14063
# 4     d    a -0.28061
# 5     e    a  0.80519

zdf 0.5)
选择有效值。

有几种方法可以可视化相关矩阵,以便快速了解数据集。下面是一个看起来不错的方法。

基于@Marek的答案。 消除对角线和重复项

data = as.data.frame( as.table( z ) )
combinations = combn( colnames( z ) , 2 , FUN = function( x ) { paste( x , collapse = "_" ) } )
data = data[ data$Var1 != data$Var2 , ]
data = data[ paste( data$Var1 , data$Var2 , sep = "_" ) %in% combinations , ]

从Marek的回答开始,我添加了几行常用清洁语句:


更多关于第4行的信息,请点击此处:

太棒了!melt很少跳出来给我用。谢谢<代码>z[z==1]重复@亚伦:是的,这是完全相同的问题。我道歉!(我确实浏览了相关的问题列表,但完全错过了那一个。)但是(至少对我来说)注意答案中的相似性和差异是有教育意义的。谢谢你的想法。当然,对于100多个列来说,这有点不切实际(除非我的列以某种有意义的方式聚集在一起)。谢谢。它仍然包含对角线,包含每个相关性两次,并且没有排序,但我使用它作为我使用的解决方案的起点。
zdf <- as.data.frame(as.table(z))
zdf
#    Var1 Var2     Freq
# 1     a    a  1.00000
# 2     b    a -0.99669
# 3     c    a -0.14063
# 4     d    a -0.28061
# 5     e    a  0.80519
data = as.data.frame( as.table( z ) )
combinations = combn( colnames( z ) , 2 , FUN = function( x ) { paste( x , collapse = "_" ) } )
data = data[ data$Var1 != data$Var2 , ]
data = data[ paste( data$Var1 , data$Var2 , sep = "_" ) %in% combinations , ]
  df_cor %>%                               # start from the correlation matrix
  as.table() %>% as.data.frame() %>%       # Marek's answer in TidyVerse format
  subset(Var1 != Var2 & abs(Freq)>0.5) %>% # omit diagonal and keep significant correlations (optional...)
  filter(!duplicated(paste0(pmax(as.character(Var1), as.character(Var2)), pmin(as.character(Var1), as.character(Var2))))) %>%
                                           # keep only unique occurrences, as.character because Var1 and Var2 are factors
  arrange(desc(Freq))                      # sort by Freq