2014-09-07 1 views
2

Итак, я смог разработать граф объектов на основе текста, образец ниже.Назовите уже пронумерованные вершины в неориентированном графе, используя R

        X1 X2 
       PERSON Sherlock Holmes 1 
     PERSON Sir Arthur Conan Doyle 1 
       PERSON Sherlock Holmes 2 
         PERSON Watson 2 
        PERSON Moriarty 2 

Мне удалось создать неориентированный граф с отношениями между объектами в столбце X1 и столбце X2. Числа в столбце X2 являются номерами групп. Шерлок Холмс и сэр Артур Конан Дойль находятся в одной группе. В идеале я хотел бы создать и ненаправленный график не между сущностью в столбце X1 и номером группы в столбце X2, а с сущностью и другими членами группы, как показано ниже.

        X1 X2 
       PERSON Sherlock Holmes PERSON Sherlock Holmes 
       PERSON Sherlock Holmes PERSON Sir Arthur Conan Doyle 
     PERSON Sir Arthur Conan Doyle PERSON Sir Arthur Conan Doyle 
     PERSON Sir Arthur Conan Doyle PERSON Sherlock Holmes 
       PERSON Sherlock Holmes PERSON Sherlock Holmes 
       PERSON Sherlock Holmes PERSON Watson 
       PERSON Sherlock Holmes PERSON Moriarty 
         PERSON Watson PERSON Watson 
         PERSON Watson PERSON Sherlock Holmes 
         PERSON Watson PERSON Moriarty 
        PERSON Moriarty PERSON Moriarty 
        PERSON Moriarty PERSON Sherlock Holmes 
        PERSON Moriarty PERSON Watson 

Было бы очень хорошо, чтобы быть в состоянии удалить дубликаты в пределах графика, так что я получил результат ниже.

        X1 X2 
       PERSON Sherlock Holmes PERSON Sir Arthur Conan Doyle 
     PERSON Sir Arthur Conan Doyle PERSON Sherlock Holmes 
       PERSON Sherlock Holmes PERSON Watson 
       PERSON Sherlock Holmes PERSON Moriarty 
         PERSON Watson PERSON Sherlock Holmes 
         PERSON Watson PERSON Moriarty 
        PERSON Moriarty PERSON Sherlock Holmes 
        PERSON Moriarty PERSON Watson 

Я использовал приведенный ниже код, чтобы получить текст в фрейме данных с номерами групп.

num.el <- sapply(entities.list, length) 
association.matrix <- cbind(unlist(entities.list), rep(1:length(entities.list), num.el)) 

Так вот, фактический код я получаю с ошибками по просьбе мистера Флика. Данные - электронное электронное письмо.

entities.list <- 
$all4 
[1] " "   "PERSON kaye" 

$all9 
[1] "MISC Content-Type : text plain; charset=us-ascii" "ORGANIZATION X-From"       
"PERSON Kaye Ellis"        
[4] "PERSON Lisa Mackey"        "MISC X-bcc" 

Соответствуют список dataframe

association.matrix <- data.frame(matrix(unlist(entities.list), byrow=T)) 
association.matrix 

Соответствуют список в список, где объекты в одном элементе списка сгруппированы по ассоциации в ряде

num.el <- sapply(entities.list, length) 
association.matrix <- cbind(unlist(entities.list), rep(1:length(entities.list), num.el)) 

удалить пустые строки записи

association.matrix <- association.matrix[!apply(association.matrix, 1, function(x)  
any(x==" ")),] 

принуждать матрица для dataframe и удаления строк, как факторы association.matrix < - data.frame (association.matrix, stringsAsFactors = FALSE)

Таким образом, данные выглядят как это сейчас

           X1 X2 
1          PERSON kaye 1 
2 MISC Content-Type : text plain; charset=us-ascii 2 
3        ORGANIZATION X-From 2 
4        PERSON Kaye Ellis 2 
5        PERSON Lisa Mackey 2 
6          MISC X-bcc 2 

Вот г-н Сценарий Флика, который я пытаюсь получить

association.matrix <- do.call(rbind, lapply(tapply(association.matrix$X1,  
association.matrix$X2, combn, 2), function(x) 
    rbind(t(x), t(x)[,2:1]))) 

И вот ошибка, которую я получаю.

Error in FUN(X[[1L]], ...) : n < m 

ответ

1

Так что, если ваш ввод данных

dd<- data.frame(X1 = c("PERSON Sherlock Holmes", "PERSON Sir Arthur Conan Doyle", 
    "PERSON Sherlock Holmes", "PERSON Watson", "PERSON Moriarty"), 
    X2 = c(1L, 1L, 2L, 2L, 2L), stringsAsFactors=FALSE 
) 

Похоже, что вы можете создать результаты, которые вы хотите с

mm <- do.call(rbind, lapply(tapply(dd$X1, dd$X2, combn, 2), function(x) 
    rbind(t(x), t(x)[,2:1])) 
) 

, который дает

 [,1]       [,2]       
[1,] "PERSON Sherlock Holmes"  "PERSON Sir Arthur Conan Doyle" 
[2,] "PERSON Sir Arthur Conan Doyle" "PERSON Sherlock Holmes"  
[3,] "PERSON Sherlock Holmes"  "PERSON Watson"     
[4,] "PERSON Sherlock Holmes"  "PERSON Moriarty"    
[5,] "PERSON Watson"     "PERSON Moriarty"    
[6,] "PERSON Watson"     "PERSON Sherlock Holmes"  
[7,] "PERSON Moriarty"    "PERSON Sherlock Holmes"  
[8,] "PERSON Moriarty"    "PERSON Watson" 

и вы можете сделайте, что ориентированный граф wi го

library(igraph) 
gg <- graph.edgelist(mm) 

enter image description here

+0

К сожалению я не ответила раньше, не могу за жизнь мне получить эту работу на моих фактических данных. Ваш пример отлично работал. Продолжайте получать ошибку Ошибка в FUN (X [[1L]], ...): n Jake

+0

@Jake Без воспроизводимого примера я не могу помочь. Я понятия не имею, что может быть неправильным в ваших реальных данных. – MrFlick

+0

Добавлен пример, дайте мне знать, что вы думаете и спасибо! – Jake