如何在 R 中不重复地对所有列进行一次配对?

How to pair all columns once with no repeats in R?

我有一个包含 200 列和每列 1000 行观察值的数据集。我试图找到每一列之间的相关性,没有重复。因此,例如,第 1 列和第 2 列、第 1 列和第 3 列、第 2 列和第 3 列,但不是第 3 列和第 1 列,因为它与第一对相同。从数学上讲,我应该有 19900 对列,但我不知道如何得到它。到目前为止我的代码如下:

corr.results<- rep(NA,19900)
for(i in 1:19900)
  {
  column1<- i
  column2<- i+1
  
  results<- cor.test(all.null.data[ ,column1], all.null.data[ ,column2], 
                          alternative = "two.sided", method="pearson", 
                          exact=NULL, conf.level=0.95, continuity=FALSE)
  corr.results[i]<- results$p.value
}

View(corr.results)

显然,这是不正确的,因为我只做相邻的对(例如 1&2、2&3、3&4 等),但这就是我目前的全部。

将您的示例与(双)循环和 mtcars 玩具数据集一起使用

res=list()
for (i in 1:(ncol(mtcars)-1)) {
  for (j in (i+1):ncol(mtcars)) {
    res=c(
      res,
      list(c(i,j,cor.test(mtcars[,i],mtcars[,j])$p.value))
    )
  }
}
res=do.call(rbind,res)
colnames(res)=c("i","j","p")

使用combn创建所有可能的组合。

combn(seq_along(all.null.data), 2, function(x) {
  cor.test(all.null.data[ ,x[1]], all.null.data[ ,x[2]], 
           alternative = "two.sided", method="pearson", 
           exact=NULL, conf.level=0.95, continuity=FALSE)$p.value
}) -> corr.results

corr.results

对于 200 列,它将 return 19900 个值提供给您。

ncol(combn(1:200, 2))
#[1] 19900