计算一列与所选其他列之间的相关性,无需循环


w= as.numeric()
for(i in 2:10)){
    w[i] = cor(a[,1], a[,i], method = "pearson", use = "complete.obs")
 }

有没有办法将下面的for循环转换为一行代码,如下所示?

w[1:9] = cor(a[,1], a[,i], method = "pearson", use = "complete.obs")

怎么样:

w = sapply(c(2:10), function(x) cor(a[,1], a[,x], method = "pearson", use = 'pairwise.complete.obs') )

假设您使用2:10的原因是因为有 10 个 col。如果是这种情况,并且您希望它更加动态:

w = sapply(c(2:ncol(a)), function(x) cor(a[,1], a[,x], method = "pearson", use = "complete.obs") )

最后,如果您不想使用 apply 系列,则可以生成整个cor矩阵并从第一行中提取所需的内容:

w = cor(a, method = 'pearson', use = 'pairwise.complete.obs')[1,-1]

可重现的示例:

> a = iris[,1:4]
> cor(a, method = 'pearson', use = 'pairwise.complete.obs')[1,-1]
 Sepal.Width Petal.Length  Petal.Width 
 -0.1175698    0.8717538    0.8179411 

编辑:如果要检索其他列(例如 2)的相关性:

> cor(a, method = 'pearson', use = 'pairwise.complete.obs')[2,-2]
Sepal.Length Petal.Length  Petal.Width 
-0.1175698   -0.4284401   -0.3661259 

此外,根据Joris Meys的建议,请确保使用'pairwise.complete.obs'

您可以通过将矩阵指定为 cor() 的 y 参数来非常轻松地做到这一点:

> a <- matrix(runif(100),ncol=5)
> colnames(a) <- LETTERS[1:5]
> cor(a[,2], a[,c(3:5,1)], use = 'pairwise.complete.obs')
             C         D          E           A
[1,] 0.3096647 0.6383469 -0.3527352 -0.08329776

这样可以避免计算您不感兴趣的相关性。如果从 cor(a) 中选择相关相关性,则还将计算其他列之间的所有相关性。

请注意,与sapply()解决方案不同,您需要将use设置为 pairwise.complete.obs 。 否则,R 将删除其中一列中缺少值的所有行。

另请参阅?cor

最新更新