Сделать матрицу смежности в R - PullRequest
1 голос
/ 02 мая 2020

Я хочу создать матрицу смежности из кадра данных (mydata), состоящего из нескольких строк со следующим правилом:

  1. Вывести все буквы в виде квадратной матрицы
  2. Подсчет и сумма номер соединения от source от остальных столбцов (p1 p2 p3 p4 p5) соответствующих строк. Например, b связан с a (2 и 8 строк) 5 раз.
  3. Если буква не включена в source, значения соединения должны быть равны нулю.

Фрейм данных:

mydf <- data.frame(p1=c('a','a','a','b','g','b','c','c','d'),
                               p2=c('b','c','d','c','d','e','d','e','e'),
                               p3=c('a','a','c','c','d','d','d','a','a'),
                               p4=c('a','a','b','c','c','e','d','a','b'),
                               p5=c('a','b','c','d','I','b','b','c','z'),
                               source=c('a','b','c','d','e','e','a','b','d'))

Матрица смежности должна выглядеть следующим образом

        a b c d e g I z
      a 4 2 1 3 0 0 0 0
      b 5 1 3 0 1 0 0 0
      c 1 1 2 1 0 0 0 0
      d 1 2 3 2 1 0 0 1
      e 0 2 1 3 2 1 1 0
      g 0 0 0 0 0 0 0 0
      I 0 0 0 0 0 0 0 0
      z 0 0 0 0 0 0 0 0

У меня есть сотни столбцов и тысячи строк. Буду признателен за самый быстрый способ сделать это в R

1 Ответ

2 голосов
/ 02 мая 2020

В базе R мы можем использовать table:

vals <- unlist(mydf[-ncol(mydf)])
table(factor(rep(mydf$source, ncol(mydf) - 1), levels = unique(vals)), vals)

#  vals
#    a b c d e g I z
#  a 4 2 1 3 0 0 0 0
#  b 5 1 3 0 1 0 0 0
#  g 0 0 0 0 0 0 0 0
#  c 1 1 2 1 0 0 0 0
#  d 1 2 3 2 1 0 0 1
#  e 0 2 1 3 2 1 1 0
#  I 0 0 0 0 0 0 0 0
#  z 0 0 0 0 0 0 0 0

В tidyverse мы можем сделать:

library(dplyr)
library(tidyr)

mydf %>%
  pivot_longer(cols = -source) %>%
  count(source, value) %>%
  pivot_wider(names_from = value, values_from = n) %>%
  complete(source = names(.)[-1]) %>%
  mutate_all(~replace_na(., 0))
...