Создать что-то вроде матрицы расстояний - PullRequest
0 голосов
/ 11 марта 2020

У меня есть матрица из 3 столбцов, которая содержит идентификаторы и оценки между ними.

> df1
           ID_1       ID_2    Score
  1: 1000020760 1000534822 1.70e-01
  2: 1000020760 1000535109 1.10e+00
  3: 1000020760 1000532510 3.20e+00
  4: 1000020760 1000535228 3.70e+00
  5: 1000035849 1000532512 2.49e-60
 ---                               
600: 1000773219 1000483302 2.40e+00
601: 1000773219 1000734829 8.50e+00
602: 1000773219 1000535109 1.00e+01
603: 1000773304 1000730133 5.80e+00
604: 1000773304 1000752994 9.20e+00

Каждое значение из первого столбца имеет несколько соответствующих значений из второго (включая отсутствие значений). Значение из третьего столбца не коммутирует по первым двум. Например:

> df1[4,]
         ID_1       ID_2 Score
1: 1000020760 1000535228   3.7

> df1[294,]
         ID_1       ID_2 Score
1: 1000535228 1000020760   3.9

Идентичные идентификаторы, но стоящие в разных местах, имеют разные оценки.

Я хотел бы создать матрицу m * m (m - это максимальное количество уникальных номеров). Идентификаторы в df1$ID_1 и df1$ID_2), элементы которых являются соответствующими значениями из третьего столбца входной таблицы. Строки и столбцы выходной матрицы должны состоять из идентификаторов, а на пересечении - соответствующих значений из столбца Score входной матрицы. Значения на главной диагонали должны быть равны 0, а недостающие значения должны быть равны NA.

Например, если у меня есть такой ввод

> tmp1
         ID_1       ID_2 Score
1: 1000020760 1000534822  0.17
2: 1000020760 1000535109  1.10
3: 1000020760 1000532510  3.20
4: 1000020760 1000535228  3.70
5: 1000535228 1000483302  2.50
6: 1000535228 1000020760  3.90
7: 1000535228 1000414853  5.10
8: 1000534822 1000020760  0.06

Мне бы хотелось чтобы увидеть такой вывод

> tmp_mat
           1000534822 1000535109 1000532510 1000535228 1000483302 1000020760 1000414853
1000534822       0.00         NA         NA         NA         NA       0.06         NA
1000535109         NA        0.0         NA         NA         NA         NA         NA
1000532510         NA         NA        0.0         NA         NA         NA         NA
1000535228         NA         NA         NA        0.0        2.5       3.90        5.1
1000483302         NA         NA         NA         NA        0.0         NA         NA
1000020760       0.17        1.1        3.2        3.7         NA       0.00         NA
1000414853         NA         NA         NA         NA         NA         NA        0.0

1 Ответ

1 голос
/ 11 марта 2020

Вектор, содержащий уникальные значения ID_1 и ID_2, расширяется, чтобы получить все комбинации. Scores затем включаются, где это возможно, и диагональные элементы обнуляются. Наконец, результаты могут быть переформатированы как широкие tibble. Используя библиотеку tidyverse, код будет

library(tidyverse)

ID_table <- unique(x = c(df1$ID_1, df1$ID_2)) %>% sort() %>% expand_grid(ID_1 = ., ID_2 = .) %>%
            left_join(df1, by = c("ID_1", "ID_2")) %>% mutate(Score = ifelse(ID_1 == ID_2, 0, Score)) %>%
            pivot_wider(names_from = ID_2, values_from = Score)

с результатом

# A tibble: 7 x 8
        ID_1 `1000020760` `1000414853` `1000483302` `1000532510` `1000534822` `1000535109` `1000535228`
       <int>        <dbl>        <dbl>        <dbl>        <dbl>        <dbl>        <dbl>        <dbl>
1 1000020760         0            NA           NA            3.2         0.17          1.1          3.7
2 1000414853        NA             0           NA           NA          NA            NA           NA  
3 1000483302        NA            NA            0           NA          NA            NA           NA  
4 1000532510        NA            NA           NA            0          NA            NA           NA  
5 1000534822         0.06         NA           NA           NA           0            NA           NA  
6 1000535109        NA            NA           NA           NA          NA             0           NA  
7 1000535228         3.9           5.1          2.5         NA          NA            NA            0 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...