Матрица, преобразованная из объекта расстояния, поведение подмножества отличается от нормальных матриц - PullRequest
3 голосов
/ 09 апреля 2020

Если я создаю матрицу с нуля, я могу поднастроить ее различными способами, сохранив имена столбцов:

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) - «Удержание ветрового носка»

1 Ответ

3 голосов
/ 09 апреля 2020

Разница в том, что во втором есть row.names. Если мы установим его на NULL, то он должен иметь такое же поведение. По умолчанию drop = TRUE, и мы получаем named вектор. Когда есть и имена строк, и имена столбцов, эти атрибуты удаляются при 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...