Преобразование df в ребра df для совместной работы - PullRequest
2 голосов
/ 27 апреля 2019

У меня есть этот df, который содержит информацию о сотрудничестве статей:

     author    author2 author3 author4
1      A       D       E       F
2      B       G
3      C       H       F

Мне нужно создать edges фрейм данных, который содержит отношения между авторами, например:

    from      to 
1      A       D   
2      A       E
3      A       F  
4      B       G
5      C       H
6      C       F
7      D       E
8      D       F
9      E       F
11     H       F

есть идеи как это сделать?

Ответы [ 2 ]

1 голос
/ 27 апреля 2019

Вы можете применять combn построчно внутри функции, нет необходимости в пакетах.

edges <- setNames(as.data.frame(do.call(rbind, lapply(seq(nrow(d)), function(x) 
  matrix(unlist(t(combn(na.omit(unlist(d[x, ])), 2))), ncol=2)))), c("from", "to"))
edges
#    from to
# 1     A  D
# 2     A  E
# 3     A  F
# 4     D  E
# 5     D  F
# 6     E  F
# 7     B  G
# 8     C  H
# 9     C  F
# 10    H  F

Или, используя пакет igraph в качестве @ akrun .

library(igraph)
edges <- do.call(rbind, apply(d, 1, function(x) 
  as_data_frame(graph_from_data_frame(t(combn(na.omit(x), 2))))))
edges
#    from to
# 1     A  D
# 2     A  E
# 3     A  F
# 4     D  E
# 5     D  F
# 6     E  F
# 7     B  G
# 8     C  H
# 9     C  F
# 10    H  F

Данные

d <- structure(list(author = c("A", "B", "C"), author2 = c("D", "G", 
"H"), author3 = c("E", NA, "F"), author4 = c("F", NA, NA)), row.names = c(NA, 
-3L), class = "data.frame")
1 голос
/ 27 апреля 2019

Мы можем gather каждый столбец против остальных столбцов, то есть слева от этого столбца, а затем связать все.

library(tidyverse)
map_dfr(names(df)[-length(df)], ~select(df,.x:ncol(df)) %>% gather( k,to,-.x) %>% 
                                 arrange(!!ensym(.x)) %>% select(-k) %>% filter(to!='') %>% 
                                 rename(form=starts_with('author')))

    form to
1     A  D
2     A  E
3     A  F
4     B  G
5     C  H
6     C  F
7     D  E
8     D  F
9     H  F
10    E  F

Данные

df <- structure(list(author = c("A", "B", "C"), author2 = c("D", "G", 
"H"), author3 = c("E", "", "F"), author4 = c("F","", "")), class = "data.frame", row.names = c("1", 
"2", "3"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...