2013-05-21 166 views
4

如何在给定数据帧的列数很多的情况下,在R中以优雅的方式产生秩相关矩阵?我无法找到一个内置的功能,所以我试图R中的秩相关矩阵

> test=data.frame(x=c(1,2,3,4,5), y=c(5,4,3,2,1)) 
> cor(rank(test)) 

(仅2列简单,真实的数据有5列),这给了

> Error in cor(rank(test)) : supply both 'x' and 'y' or a matrix-like 'x' 

我想,这是因为rank采取一个单一的载体。于是我试着

> cor(lapply(test,rank)) 

获得排名的数据帧应用于每一列,处理数据帧的名单,这给了错误

> supply both 'x' and 'y' or a matrix-like 'x' 

,我终于结束了越来越与

> cor(data.frame(lapply(test,rank))) 
    x y 
x 1 -1 
y -1 1 

但是这似乎相当详细和丑陋。我在想一定有更好的办法 - 如果是的话?

+2

您的列表/数据框问题可以通过使用'sapply'来代替,最有可能的。 – joran

+0

@joran非常感谢您对sapply的支持,它说它是lapply的简化版本,特别是将结果作为矩阵返回,如果可以的话。 – TooTone

回答

6

你做错了 - 使用kendall方法参数为cor()代替:

R> testdf <- data.frame(x=c(1,2,3,4,5), y=c(5,4,3,2,1)) 
R> cor(testdf, method="kendall") 
    x y 
x 1 -1  
y -1 1 
R> 

help(cor)

对于cor(),如果方法是"kendall""spearman",Kendall的tau或 斯皮尔曼的rho统计量用于估计一个基于等级的衡量 关联。如果 数据不一定来自二元正态分布,则这些更加健壮并且被推荐。对于 cov(),非皮尔逊方法是不寻常的,但可用于完整性。请注意,"spearman"基本上计算cor(R(x), R(y)) (或cov(.,.))其中R(u) := rank(u, na.last="keep")。在 缺失值的情况下,排名根据 的使用值进行计算,无论是基于完整的观察结果,还是基于成对排列的每对配对的完整性。