Таблица необработанных данных для матрицы смежности / социоматрицы - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть таблица данных, расположенная так:

ID       Category 1       Category 2     Category 3
Name 1   Example 1        Example 2      Example 3
Name 2   Example 1        Example 2      Example 4
Name 3   Example 5        Example 6      Example 4
....    ....             ....            .....

Я пытаюсь превратить ее в таблицу, подобную этой:

        Name 1     Name 2     Name 3   ....
 Name 1    0        2          0    
 Name 2    2        0          1
 Name 3    0        1          0
  ....

Где каждая ячейка в выходной таблицепредставляет, сколько категорий были одинаковыми при сравнении между идентификаторами.Это также может быть то, сколько категорий были разными, любая из них будет работать.Я рассмотрел матрицы смежности и социоматрицы при переполнении стека, а также некоторые рекомендации по сопоставлению матриц, но я не думаю, что моя таблица данных настроена правильно.Кто-нибудь есть какие-либо рекомендации о том, как это должно быть сделано?

РЕДАКТИРОВАТЬ: Ах, извинения.Я использую R в качестве моей программы.Оставил этот бит

1 Ответ

0 голосов
/ 26 апреля 2018

Вы можете сделать это, сначала поместив ваши данные в длинный формат, после чего это становится довольно простым упражнением:

# your data
tdf <- data.frame(ID = paste0("Name ", 1:3), cat1 = paste0("Example ", c(1,1,5)),
                  cat2 = paste0("Example ", c(2,2,6)),
                  cat3= paste0("Example ", c(3,4,4)))
tdf
#>       ID      cat1      cat2      cat3
#> 1 Name 1 Example 1 Example 2 Example 3
#> 2 Name 2 Example 1 Example 2 Example 4
#> 3 Name 3 Example 5 Example 6 Example 4

# the categories are extraneous, what matters is the relationship of ID to 
# the Example values, so we melt the df to long format using the 
# melt function from the package reshape2
lfd <- reshape2::melt(tdf, id.vars = "ID")
#> Warning: attributes are not identical across measure variables; they will
#> be dropped

# create an affiliation matrix
adj1 <- as.matrix(table(lfd$ID, lfd$value))
adj1
#>         
#>          Example 1 Example 2 Example 3 Example 4 Example 5 Example 6
#>   Name 1         1         1         1         0         0         0
#>   Name 2         1         1         0         1         0         0
#>   Name 3         0         0         0         1         1         1

# Adjacency matrix is simply the product
id_id_adj_mat <- adj1 %*% t(adj1)
# Set the diagonal to zero (currently diagonal displays degree of each node)
diag(id_id_adj_mat) <- 0
id_id_adj_mat
#>         
#>          Name 1 Name 2 Name 3
#>   Name 1      0      2      0
#>   Name 2      2      0      1
#>   Name 3      0      1      0
...