R 将相关性显示为有序列表,而不是大型矩阵
我有一个100多列的数据框。cor()返回速度非常快,但告诉我的太多了,特别是因为大多数列都不相关。我想让它告诉我列对和它们的相关性,理想的顺序 如果这不合理,这里有一个人为的例子: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
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