我有一个巨大的数据帧5600 X 6592,我想删除任何相互关联超过0.99的变量.我知道如何一步一步地完成这项工作,即形成一个相关矩阵,对值进行舍入,删除类似的值,并使用索引再次获得我的"简化"数据.

cor(mydata)
mydata <- round(mydata,2)
mydata <- mydata[,!duplicated (mydata)]
## then do the indexing...

我想知道,这是否可以在短时间内完成,或一些先进的功能.我正在学习如何使用R语言中的强大工具,它可以避免这么长时间不必要的命令

我在想

mydata <- mydata[, which(apply(mydata, 2, function(x) !duplicated(round(cor(x),2))))]

抱歉,我知道上面的命令不起作用,但我希望我能做到这一点.

适用于以下问题的播放数据:

mydata <- structure(list(V1 = c(1L, 2L, 5L, 4L, 366L, 65L, 43L, 456L, 876L, 
78L, 687L, 378L, 378L, 34L, 53L, 43L), V2 = c(2L, 2L, 5L, 4L, 
366L, 65L, 43L, 456L, 876L, 78L, 687L, 378L, 378L, 34L, 53L, 
41L), V3 = c(10L, 20L, 10L, 20L, 10L, 20L, 1L, 0L, 1L, 2010L, 
20L, 10L, 10L, 10L, 10L, 10L), V4 = c(2L, 10L, 31L, 2L, 2L, 5L, 
2L, 5L, 1L, 52L, 1L, 2L, 52L, 6L, 2L, 1L), V5 = c(4L, 10L, 31L, 
2L, 2L, 5L, 2L, 5L, 1L, 52L, 1L, 2L, 52L, 6L, 2L, 3L)), .Names = c("V1", 
"V2", "V3", "V4", "V5"), class = "data.frame", row.names = c(NA, 
-16L))

非常感谢

推荐答案

我相信有很多方法可以做到这一点,当然还有比这更好的方法,但这应该是可行的.我基本上只是将上三角形设置为零,然后删除所有值超过0.99的行.

tmp <- cor(data)
tmp[upper.tri(tmp)] <- 0
diag(tmp) <- 0

# Above two commands can be replaced with 
# tmp[!lower.tri(tmp)] <- 0

 
data.new <- 
  data[, !apply(tmp, 2, function(x) any(abs(x) > 0.99, na.rm = TRUE))]
head(data.new)

   V2 V3 V5
1   2 10  4
2   2 20 10
3   5 10 31
4   4 20  2
5 366 10  2
6  65 20  5

R相关问答推荐

R:将列名的字符载体传递给可以 Select 接受多个参数的函数

将收件箱变量传递给ggplot 2函数

R中的枢轴/转置

寻找图片边缘

按R中的组查找相邻列的行累积和的最大值

R等效于LABpascal(n,1)不同的列符号

x[[1]]中的错误:脚注越界

使用R中的Shapetime裁剪格栅文件

如何 bootstrap glm回归、估计95%置信区间并绘制它?

如何对数据集进行逆向工程?

如何自定义Shapviz图?

使用across,starts_with和ifelse语句变更多个变量

R中的哈密顿滤波

用两种 colored颜色 填充方框图

过滤名称以特定字符串开头的文件

识别连接的子网(R-igraph)

如何在R中使用hmm TMB提前一步预测观察到的状态?

为什么这个表格格罗布不打印?

如何在R中创建条形图,使条形图在y轴上围绕0.5而不是0构建条形图?

替换在以前工作的代码中有x行&q;错误(geom_sf/gganimate/dow_mark)