2015-11-04 58 views
0

我有一个数据框,并希望创建一个函数,其中只保留具有低相关性的变量。这意味着查看每个变量与其余变量的成对相关性,并且对于那些至少有一个相关系数大于0.4的变量,从数据框中取出这个变量和一个高度相关的变量。子集数据框根据基于相关性的标准

例如假设我有一个数据帧:

data <- data.frame(x1=rnorm(10), x2=rnorm(10), x3=runif(10), x4=runif(10,15,20)) 
cor(data, use="pairwise.complete.obs") 

      x1   x2   x3   x4 
x1 1.00000000 -0.3325757 0.08567911 0.2651721 
x2 -0.33257569 1.0000000 -0.18761301 0.4660056 
x3 0.08567911 -0.1876130 1.00000000 -0.03 
x4 0.26517210 0.4660056 -0.031 1.0000000 

然后我会喜欢返回一个数据帧只保持X 1和X(假定x2和x4具有0.46的相关性)

+0

你要考虑超过一定强度的负相关性? – Jay

回答

3

计算相关矩阵cd,检查是否有什么>0.4。 然后离开子集,忽略diag onals,其中row==col

cd <- abs(cor(data, use="pairwise.complete.obs")) > 0.4 
data[-unique(col(cd)[cd & row(cd) != col(cd)])] 
+0

OP已经接受你的回答,但我不知道是否应该考虑负相关 – Jay

+1

@jay - 好点,将它包裹在“abs”中将会把它整理出来。 – thelatemail

2

你可以尝试:

set.seed(50) 
data <- data.frame(x1=rnorm(10), x2=rnorm(10), x3=runif(10), x4=runif(10,15,20)) 
mycor <- cor(data, use="pairwise.complete.obs") 
data[, !apply(mycor, 2, function (x) max(x[-which.max(x)]) >.4 | min(x[which.min(x)]) < -.4) ] 
+0

我想你想在最后一行代替'data',而不是'mycor' – thelatemail

+0

你是对的 - 我误解了OP的期望输出 – Jay