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

时间:2016-02-10 14:30:57

标签: r

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")

2 个答案:

答案 0 :(得分:3)

怎么样:

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

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

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

最后,如果您不想使用申请系列,则可以生成整个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'

答案 1 :(得分:1)

通过将矩阵指定为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