Создание аккуратного фрейма данных, показывающего совместное вхождение: три столбца для сети совместного вхождения, использующие данные из списка неравных векторов символов - PullRequest
1 голос
/ 21 июня 2019

Мне нужна помощь в поиске решения для структурирования данных для использования с сетевым пакетом r?

У меня есть список author_list, содержащий несколько авторов на каждый символьный вектор, например ::100100

document_authors1 = c ("Кинг, Стивен", "Мартин, Джордж", "Клэнси, Том")

document_authors2 = c («Клэнси, Том», «Паттерсон, Джеймс», «Стин, Р.Л.», «Кинг, Стивен»)

document_authors3 = c («Клэнси, Том», «Паттерсон, Джеймс», «Стин, Р.Л.», «Кинг, Стивен»)

author_list = list (document_authors1, document_authors2, document_authors3)

author_list

[[1]] [1] «Кинг, Стивен», «Мартин, Джордж», «Клэнси, Том»

[[2]] [1] «Клэнси, Том», «Паттерсон, Джеймс», «Стайн, Р.Л.» "Король Стивен"

[[3]] [1] «Клэнси, Том», «Паттерсон, Джеймс», «Стайн, Р.Л.» "Король Стивен"

Мне нужно создать фрейм данных на основе author_list, в котором есть три столбца. Первые два столбца имеют имена авторов, где col1 имеет значение строки одного автора, а col2 - значение строки другого автора, а третий столбец, называемый co -опроявлением, предоставляет частоту, с которой пара авторов (col1 и col2) Строка 1) встречаются. Например,

      col1                     col2                            co-occurrence
1 King, Stephen           Patterson, James                           2
2 Martin, George             Clancy, Tom                             1

Etc ...

Я пытался найти функцию из пакета, чтобы сделать это, но не повезло. Я также пытался пошагово собрать решение, но, похоже, это намекает на меня. Надеюсь, это проще, чем я думаю. Буду признателен за любые советы или предложения.

1 Ответ

0 голосов
/ 21 июня 2019

Я не совсем уверен, что это то, что вас интересует, но надеюсь, что это будет полезно.

library(dplyr)

# Only include elements in list with more than one author
author_list <- author_list[lengths(author_list)>1]

# Identify every combination of pairs of authors for each element in list
mat <- do.call(rbind, lapply(1:length(author_list), function(x) t(combn(author_list[[x]],2))))

# Within each row sort alphabetically 
mat <- t(apply(mat, 1, sort))

# Count up pairs of authors
as.data.frame(mat) %>%
  group_by_all() %>%
  summarise(count = n())

# A tibble: 8 x 3
# Groups:   V1 [3]
  V1               V2               count
  <fct>            <fct>            <int>
1 Clancy, Tom      King, Stephen        3
2 Clancy, Tom      Martin, George       1
3 Clancy, Tom      Patterson, James     2
4 Clancy, Tom      Stine, R.L.          2
5 King, Stephen    Martin, George       1
6 King, Stephen    Patterson, James     2
7 King, Stephen    Stine, R.L.          2
8 Patterson, James Stine, R.L.          2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...