【问题标题】:R sapply function ifelse variable comparisonR sapply函数ifelse变量比较
【发布时间】:2014-01-07 10:01:08
【问题描述】:

我正在尝试使用 sapplyfunction(x,y) 来循环我的矩阵..

test<-sapply(colnames(my_mat), function(x, y) ifelse (x==y,-1,cor(test_mat[,x],test_mat[,y], use="p")) )

基本上它计算每列单元格之间的相关性,但是当它们都是同一个对象时,我希望它返回 -1 而不是 1。我的矩阵设置如下:

   A B C
A  . . .
B  . . .
C  . . .

我想要对角线上的 -1。

我收到一条错误消息,提示 Error in x == y : 'y' is missing,但如果我删除 ifelse,代码可以正常工作(尽管对角线中有 1 而不是 -1)。有什么想法吗?

谢谢。

【问题讨论】:

    标签: r function variables matrix


    【解决方案1】:

    cor 是矢量化的,并且有一种矩阵方法,所以要实现这一点,您真正需要做的就是计算矩阵与其自身的相关性,从而给出每列之间的相关性。注意矩阵是对称的。然后只需使用diag 将对角线元素设置为-1...

    set.seed(1)
    m <- matrix( rnorm(25) , 5 )
    #           [,1]       [,2]       [,3]        [,4]        [,5]
    #[1,] -0.6264538 -0.8204684  1.5117812 -0.04493361  0.91897737
    #[2,]  0.1836433  0.4874291  0.3898432 -0.01619026  0.78213630
    #[3,] -0.8356286  0.7383247 -0.6212406  0.94383621  0.07456498
    #[4,]  1.5952808  0.5757814 -2.2146999  0.82122120 -1.98935170
    #[5,]  0.3295078 -0.3053884  1.1249309  0.59390132  0.61982575
    
    
    cor.mat <- cor( m )
    diag(cor.mat) <- -1
    #           [,1]       [,2]       [,3]       [,4]       [,5]
    #[1,] -1.0000000  0.2789049 -0.6149659  0.2491625 -0.7615458
    #[2,]  0.2789049 -1.0000000 -0.7864121  0.5683647 -0.5313192
    #[3,] -0.6149659 -0.7864121 -1.0000000 -0.6813702  0.9353307
    #[4,]  0.2491625  0.5683647 -0.6813702 -1.0000000 -0.6429515
    #[5,] -0.7615458 -0.5313192  0.9353307 -0.6429515 -1.0000000
    

    要验证这是否正确,请检查第一列与所有其他列的相关性。你会看到返回的向量和上面cor.mat的第一列是一样的。

    cor( m[,1] , m )
    #     [,1]      [,2]       [,3]      [,4]       [,5]
    #[1,]    1 0.2789049 -0.6149659 0.2491625 -0.7615458
    

    【讨论】:

    • 谢谢,正是我想要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-03
    • 2021-05-04
    • 1970-01-01
    • 2016-04-24
    相关资源
    最近更新 更多