Преобразовать попарно матрицу расстояний в формат столбца в R - PullRequest
0 голосов
/ 04 ноября 2018

У меня есть матрица парных расстояний (4x4). Как я могу преобразовать из этой матрицы в формат столбца, где у меня есть 2 строки? Почему два ряда? Потому что я не хочу все парные сравнения, только половина из них, как я показываю в выводе. Например, если бы у меня была матрица 10х10, у меня было бы 100 сравнений, но я только 5 из этих 100 имеют отношение к мне, и эти 5 были бы видами 1 против видов 2, видов 3 против видов 4, видов 5 против видов 6, видов 7 против видов 8, видов 9 против species10.

Введите:

        species1    species2    species3    species4
species1    0   0.093165625 0.228683707 0.194066949
species2    0.093165625 0   0.155611221 0.129896673
species3    0.228683707 0.155611221 0   0.04360685
species4    0.194066949 0.129896673 0.04360685  0

Выход:

species1    species2    0.093165625
species3    species4    0.04360685

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Это довольно уникальный запрос. Вы хотите, чтобы каждая другая запись с одноразовой диагонали. OK.

Мой любимый способ переноса данных из широкоформатного формата в длинный - использование melt() из пакета reshape2. Затем создайте последовательность, которая извлекает нужные значения.

> mat <- as.matrix(read.table(text =
+     "       species1    species2    species3    species4
+ species1    0   0.093165625 0.228683707 0.194066949
+ species2    0.093165625 0   0.155611221 0.129896673
+ species3    0.228683707 0.155611221 0   0.04360685
+ species4    0.194066949 0.129896673 0.04360685  0", header = T))
> library(reshape2)
> N <- nrow(mat)
> melt(mat)[seq(from=N+1,to=N^2,by=2*(N+1)),]
       Var1     Var2      value
5  species1 species2 0.09316563
15 species3 species4 0.04360685
0 голосов
/ 04 ноября 2018

Не уверен, почему вы ожидаете, что ваша преобразованная матрица будет иметь только две строки, но в целом вы можете использовать stack

mat <- as.matrix(read.table(text =
    "       species1    species2    species3    species4
species1    0   0.093165625 0.228683707 0.194066949
species2    0.093165625 0   0.155611221 0.129896673
species3    0.228683707 0.155611221 0   0.04360685
species4    0.194066949 0.129896673 0.04360685  0", header = T))

stack(mat)[, c(1, 2, 4)]
#DataFrame with 16 rows and 3 columns
#            row      col          NA
#    <character>    <Rle>   <numeric>
#1      species1 species1           0
#2      species2 species1 0.093165625
#3      species3 species1 0.228683707
#4      species4 species1 0.194066949
#5      species1 species2 0.093165625
#...         ...      ...         ...
#12     species4 species3  0.04360685
#13     species1 species4 0.194066949
#14     species2 species4 0.129896673
#15     species3 species4  0.04360685
#16     species4 species4           0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...