Переформирование данных для построения сети - PullRequest
0 голосов
/ 23 февраля 2019

У меня есть набор данных, который я хотел бы изменить для построения в виде сети ( после проделанной работы ).Исходный фрейм данных выглядит следующим образом:

authors <- c('Author A', 'Author B', 'Author C', 
             'Author A', 'Author D', 'Author C')
affiliation <- c('University 1', 'University 2', 'University 1', 
                 'University 1', 'Institute 3', 'University 1')
manuscript <- c('Manuscript A', 'Manuscript A', 'Manuscript A', 
                'Manuscript B', 'Manuscript B', 'Manuscript B')
df <- data.frame(authors, affiliation, manuscript)

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

df_network <- data.frame('primary_author'= c('Author A', 'Author A', 
                                             'Author B', 'Author B', 
                                             'Author C', 'Author C', 
                                             'Author A','Author A', 
                                             'Author D', 'Author D', 
                                             'Author C', 'Author C'),
                         'connection'= c('Author B', 'Author C', 
                                         'Author A', 'Author C', 
                                         'Author A', 'Author B', 
                                         'Author D', 'Author C', 
                                         'Author A', 'Author C', 
                                         'Author A', 'Author D'),
                         'primary_affiliation' = c('University 1', 'University 1',
                                                   'University 2', 'University 2',
                                                   'University 1', 'University 1',
                                                   'University 1', 'University 1',
                                                   'Institute 3', 'Institute 3',
                                                   'University 1', 'University 1'),
                         'manuscript' = c('Manuscript A', 'Manuscript A',
                                          'Manuscript A', 'Manuscript A',
                                          'Manuscript A', 'Manuscript A',
                                          'Manuscript B', 'Manuscript B',
                                          'Manuscript B', 'Manuscript B',
                                          'Manuscript B', 'Manuscript B'))

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

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

Вы также можете использовать data.table для этой задачи:

library('data.table')
df <- data.table(authors, affiliation, manuscript)
df <- merge(
  df, 
  df,
  by = 'manuscript', allow.cartesian = TRUE)[authors.x != authors.y, 
                                             .(primary_author = authors.x,
                                               connection = authors.y, 
                                               primary_affiliation = affiliation.x,
                                               manuscript)]
0 голосов
/ 23 февраля 2019

Попробуйте это:

library(dplyr)

df %>% 
  left_join(df, by = "manuscript") %>% 
  filter(!authors.x == authors.y) %>% 
  select(primary_author = authors.x, 
         connection = authors.y, 
         primary_affiliation = affiliation.x, 
         manuscript)

Вывод:

   primary_author connection primary_affiliation   manuscript
1        Author A   Author B        University 1 Manuscript A
2        Author A   Author C        University 1 Manuscript A
3        Author B   Author A        University 2 Manuscript A
4        Author B   Author C        University 2 Manuscript A
5        Author C   Author A        University 1 Manuscript A
6        Author C   Author B        University 1 Manuscript A
7        Author A   Author D        University 1 Manuscript B
8        Author A   Author C        University 1 Manuscript B
9        Author D   Author A         Institute 3 Manuscript B
10       Author D   Author C         Institute 3 Manuscript B
11       Author C   Author A        University 1 Manuscript B
12       Author C   Author D        University 1 Manuscript B
...