2016-02-02 2 views
0

Если у меня есть кадр данных с двумя столбцами ID A и B, где каждое наблюдение представляет собой ребро (соединение между двумя идентификаторами), каков наилучший способ определить все непересекающиеся группы идентификаторов? Идентификаторы могут присутствовать в любом столбце и повторяться.Как найти сети в рамках фрейма данных?

В качестве примера, вот кадр данных испытаний наряду с тем, что я ожидал бы в результате:

df <- data.frame(A = rep(1:5, 2), B = c(3, 7:15)) 
# A B 
# 1 3 
# 2 7 
# 3 8 
# 4 9 
# 5 10 
# 1 11 
# 2 12 
# 3 13 
# 4 14 
# 5 15 

# Proposed results 
# Each element of the list represents a unique group 
# [[1]] 
# [1] 1 3 8 11 13 
# 
# [[2]] 
# [1] 2 7 12 
# 
# [[3]] 
# [1] 4 9 14 
# 
# [[4]] 
# [1] 5 10 15 
+0

Очень похоже на этот старый мой вопрос - [выявить группы связанных эпизодов, цепь вместе] (http://stackoverflow.com/questions/12135971/identify-groups-of-linked-episodes-which -цепь-вместе) – thelatemail

ответ

1

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

library(magrittr) 

find_relationships <- function(known_nodes, d){ 
    # takes a vector of ids, known_nodes, and data consist of ids, d 
    subset(d, A %in% known_nodes | B %in% known_nodes) %>% 
    unlist %>% 
    c(known_nodes) %>% 
    unique -> new_nodes 

    if(length(new_nodes) == length(known_nodes)){ 
    return(new_nodes) 
    } 
    else{ 
    Recall(new_nodes, d) 
    } 
} 

unique_ids <- unique(c(df$A, df$B)) 

results <- lapply(unique_ids, find_relationships, d = df) %>% unique 
Смежные вопросы