我有一个包含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[lower.tri(z,diag=TRUE)]=NA #Prepare to drop duplicates and meaningless information
z=as.data.frame(as.table(z)) #Turn into a 3-column table
z=na.omit(z) #Get rid of the junk we flagged above
z=z[order(-abs(z$Freq)),] #Sort by highest correlation (whether +ve or -ve)
答案 0 :(得分:33)
我总是使用
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
然后使用subset(zdf, abs(Freq) > 0.5)
选择重要值。
答案 1 :(得分:7)
library(reshape)
z[z == 1] <- NA #drop perfect
z[abs(z) < 0.5] <- NA # drop less than abs(0.5)
z <- na.omit(melt(z)) # melt!
z[order(-abs(z$value)),] # sort
答案 2 :(得分:2)
建立@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 , ]
答案 3 :(得分:1)
有几种方法可视化相关矩阵,以便人们可以快速了解数据集。这是一个link方法看起来很不错。
答案 4 :(得分:1)
从Marek的答案开始,我添加了几行用于使用Tidyverse pipes进行常规清洁的行:
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
第4行的更多信息:How do I select all unique combinations of two columns in an R data frame?