【问题标题】:Name already numbered vertices in an undirected graph using R使用 R 在无向图中命名已编号的顶点
【发布时间】:2014-09-07 01:22:09
【问题描述】:

所以我已经能够基于文本开发实体图,下面是一个示例。

                                  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))

所以这是我收到 Flick 先生要求的错误的实际代码。数据是一封安然邮件。

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"   

使列表符合数据框

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==" ")),] 

将矩阵强制转换为数据框并删除字符串作为因子 Association.matrix

所以数据现在看起来像这样

                                                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

【问题讨论】:

    标签: r graph social-networking igraph


    【解决方案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" 
    

    你可以把它做成一个有向图

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

    【讨论】:

    • 抱歉,我没有早点回答,我这辈子都无法处理我的实际数据。不过,您的示例效果很好。不断收到错误 FUN(X[[1L]], ...) 中的错误:n
    • @Jake 如果没有可重现的示例,我真的无能为力。我不知道你的真实数据可能有什么问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-13
    • 1970-01-01
    • 1970-01-01
    • 2013-01-21
    • 1970-01-01
    • 1970-01-01
    • 2014-01-11
    相关资源
    最近更新 更多