【问题标题】:Matrix converted from distance object, subset behaviour differs from normal matrices从距离对象转换的矩阵,子集行为不同于正常矩阵
【发布时间】:2020-07-22 13:56:09
【问题描述】:

如果我从头开始创建一个矩阵,我可以通过各种方式对其进行子集化,同时保留列名:

tmp2 <- matrix(sample(9), nrow = 3)
colnames(tmp2) <- letters[1:3]

tmp2
     a b c
[1,] 1 3 8
[2,] 7 2 6
[3,] 5 4 9

tmp2[2, 2:3]
b c 
2 6 

tmp2[3, 1]
a 
5 

在每种情况下,列名都保留在子集中。但是,如果我通过转换距离对象来创建矩阵,则行为会发生变化:

tmp <- matrix(sample(1:12), nrow = 3)
row.names(tmp) <- letters[1:3]
tmpD <- dist(tmp)
tmpDM <- as.matrix(tmpD)

tmpDM
         a         b         c
a 0.000000  9.848858  8.544004
b 9.848858  0.000000 10.099505
c 8.544004 10.099505  0.000000

tmpDM[2, 2:3]
      b       c 
 0.0000 10.0995 

tmpDM[3, 1]
[1] 8.544004

请注意,在最后一个示例中,列名被删除。如果我在计算中需要单元格的值和列的名称,这是一个问题。

为什么会发生这种情况,更重要的是,我该如何阻止它?我需要那个列名,即使子集中只有一列。

R 版本 3.6.3 (2020-02-29) -- “握住风向袋”

【问题讨论】:

    标签: r


    【解决方案1】:

    不同的是,在第二个中,有row.names。如果我们将其设置为NULL,那么它应该具有相同的行为。默认情况下,drop = TRUE,我们得到的是一个named 向量。当同时存在 row.names 和 column name 时,这些属性会在 drop = TRUE 时被删除,因为命名向量只能有一个名称

    row.names(tmpDM) <- NULL
    tmpDM[3, 1]
    #     a 
    #9.539392 
    

    只是为了一个简单的测试,如果我们做相反的事情,即将列名设置为NULL

    colnames(tmpDM) <- NULL
    tmpDM[3, 1]
    #     c 
    #5.567764 
    

    现在,c 是该向量的 name,即行名称

    这些值是不同的,因为没有set.seed,并且每次都从头开始重复


    或者如果我们使用drop = FALSE,那么dim 将保持不变

    tmpDM[3, 1, drop = FALSE]
    #        a
    #c 12.92285
    

    【讨论】:

    • 哇,这行得通。为什么??是否有一个原因?很惊喜
    • @Tyler 我更新了帖子。这可能与维度的下降有关
    猜你喜欢
    • 2021-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-04
    • 1970-01-01
    • 2017-11-06
    相关资源
    最近更新 更多