Как извлечь внутригрупповые и межгрупповые расстояния из матрицы расстояний? в R
У меня есть этот набор данных:
values<-c(0.002,0.3,0.4,0.005,0.6,0.2,0.001,0.002,0.3,0.01)
codes<-c("A_1","A_2","A_3","B_1","B_2","B_3","B_4","C_1","C_2","C_3")
names(values)<-codes
В кодах буква указывает группу и номер регистра в каждой группе. Поэтому у меня есть три группы и 3-4 случая в каждой группе (фактический набор данных намного больше, но это подмножество).
Затем я рассчитываю матрицу расстояний:
dist(values)->dist.m
Теперь я хотел бы преобразовать dist.m в наборе данных с двумя столбцами: один, содержащий расстояния "внутри" всех групп (расстояние между A_1 и A_2, между B_2 и B_4 и т. Д.), И другой, содержащий расстояния группы "между" (между A_1 и B_1, между C_1 и B_4 и т. д.)
Есть ли простой способ сделать это в R?
Любая помощь будет принята с благодарностью.
заранее большое спасибо.
Тина.
1 ответ
Они могут называть их матрицами, но на самом деле это не так. Однако есть as.matrix
функция, которая позволит вам получить матричную индексацию:
> as.matrix(dist.m)[grep("A", codes), grep("A", codes) ]
A_1 A_2 A_3
A_1 0.000 0.298 0.398
A_2 0.298 0.000 0.100
A_3 0.398 0.100 0.000
Итак, вы можете получить первую часть с довольно компактным кодом:
> sapply(LETTERS[1:3], function(let) as.matrix(dist.m)[grep(let, codes), grep(let, codes) ]
+ )
$A
A_1 A_2 A_3
A_1 0.000 0.298 0.398
A_2 0.298 0.000 0.100
A_3 0.398 0.100 0.000
$B
B_1 B_2 B_3 B_4
B_1 0.000 0.595 0.195 0.004
B_2 0.595 0.000 0.400 0.599
B_3 0.195 0.400 0.000 0.199
B_4 0.004 0.599 0.199 0.000
$C
C_1 C_2 C_3
C_1 0.000 0.298 0.008
C_2 0.298 0.000 0.290
C_3 0.008 0.290 0.000
Затем используйте отрицательную логическую адресацию, чтобы получить остальное:
> sapply(LETTERS[1:3], function(let) as.matrix(dist.m)[grepl(let, codes), !grepl(let, codes) ]
+ )
$A
B_1 B_2 B_3 B_4 C_1 C_2 C_3
A_1 0.003 0.598 0.198 0.001 0.000 0.298 0.008
A_2 0.295 0.300 0.100 0.299 0.298 0.000 0.290
A_3 0.395 0.200 0.200 0.399 0.398 0.100 0.390
$B
A_1 A_2 A_3 C_1 C_2 C_3
B_1 0.003 0.295 0.395 0.003 0.295 0.005
B_2 0.598 0.300 0.200 0.598 0.300 0.590
B_3 0.198 0.100 0.200 0.198 0.100 0.190
B_4 0.001 0.299 0.399 0.001 0.299 0.009
$C
A_1 A_2 A_3 B_1 B_2 B_3 B_4
C_1 0.000 0.298 0.398 0.003 0.598 0.198 0.001
C_2 0.298 0.000 0.100 0.295 0.300 0.100 0.299
C_3 0.008 0.290 0.390 0.005 0.590 0.190 0.009
Я не вижу способа представить это как структуру данных из двух столбцов, но вы можете использовать melt
в pkg::reshape2 получить структуру из трех столбцов:
> melt( as.matrix(dist.m)[grep("A", codes), grep("A", codes) ] )
Var1 Var2 value
1 A_1 A_1 0.000
2 A_2 A_1 0.298
3 A_3 A_1 0.398
4 A_1 A_2 0.298
5 A_2 A_2 0.000
6 A_3 A_2 0.100
7 A_1 A_3 0.398
8 A_2 A_3 0.100
9 A_3 A_3 0.000
Это дало бы вам довольно длинный фрейм данных для отображения, но было бы достаточно легко melt
внутри вызова функции.