Выборка графика в R

Я хочу сделать ориентированный граф в R, создав 2 фрейма данных: один для вершин и один для ребер. Кроме того, мой график должен иметь следующие атрибуты:

  • Нет круга (следовательно, нет A -> A)
  • Существует максимум 1 ребро между 2 узлами.

Я пришел с кодом, как показано ниже:

library(dplyr)

USER_BASE <- 1:100
MAXIMUM_USER_RELATIONSHIP = length(USER_BASE)*4

my_random <- function(vector, size, replace, seed)
{
    set.seed(seed)
    return(sample(vector, size = size, replace = replace))
}

user <- data.frame(
    id = USER_BASE
)

relationship <- data.frame(
    from = my_random(USER_BASE, MAXIMUM_USER_RELATIONSHIP, replace = TRUE, 1),
    to = my_random(USER_BASE, MAXIMUM_USER_RELATIONSHIP, replace = TRUE, 2)
) %>% filter(from != to) %>% unique()

Мой код по-прежнему допускает 2 ребра между 2 узлами (A -> B и B -> A). Как я могу достичь этого только 1 ребра между А и В?

С уважением

Изменить: Я нашел решение из: Уникальные строки, с учетом двух столбцов, в R, без порядка

Мой полный код:

library(dplyr)
library(data.table)

USER_BASE <- 1:100
MAXIMUM_USER_RELATIONSHIP = length(USER_BASE)*4

my_random <- function(vector, size, replace, seed)
{
    set.seed(seed)
    return(sample(vector, size = size, replace = replace))
}

user <- data.frame(
    id = USER_BASE
)

relationship <- data.frame(
    from = my_random(USER_BASE, MAXIMUM_USER_RELATIONSHIP, replace = TRUE, 1),
    to = my_random(USER_BASE, MAXIMUM_USER_RELATIONSHIP, replace = TRUE, 2)
) %>% filter(from != to) %>% unique()

relationship <- unique(as.data.table(relationship)[, c("from", "to") := list(pmin(from, to),
                                                 pmax(from, to))], by = c("from", "to"))

1 ответ

Вы могли бы использовать anti_join удалить любые строки, которые существуют в обращенной версии.

reverse <- data.frame(to = relationship$from, from = relationship$to)

anti_join(relationship, reverse)
Другие вопросы по тегам