【问题标题】:Adjacency matrix - edges based on arbitrary variable邻接矩阵 - 基于任意变量的边
【发布时间】:2014-01-09 21:14:26
【问题描述】:

我正在尝试从一个简单的三变量数据集生成一个邻接矩阵(稍后用于创建社交网络图)。见下文。

Year  Company  Project
2001    A       Proj1
2001    B       Proj1
2005    C       Proj3
2004    D       Proj4
2004    E       Proj4

这个想法是生成一个矩阵,其中行和列是公司,边表示任何给定的公司对是否参与了同一个项目。这看起来像:

  A B C D E
A 0 1 0 0 0 
B 1 0 0 0 0
C 0 0 0 0 0
D 0 0 0 0 1
E 0 0 0 1 0

我将如何在 R 中完成这样的事情?根据其他用户的尝试,我尝试了 reshape2,但没有运气。 任何帮助,将不胜感激。 谢谢!

【问题讨论】:

    标签: r matrix social-networking


    【解决方案1】:

    有更好的方法,但这是我知道的一种。您将需要 qdap 的开发版本。按照THIS PAGE底部的说明获取。

    ## dat <- read.table(text="Year  Company  Project
    ## 2001    A       Proj1
    ## 2001    B       Proj1
    ## 2005    C       Proj3
    ## 2004    D       Proj4
    ## 2004    E       Proj4", header=TRUE)
    
    library(qdap)
    x <- adjmat(mtabulate(split(dat$Company, dat$Project)))
    x$adjacency
    
    ## > x$adjacency
    ##   A B C D E
    ## A 1 1 0 0 0
    ## B 1 1 0 0 0
    ## C 0 0 1 0 0
    ## D 0 0 0 1 1
    ## E 0 0 0 1 1
    

    诚然,这个问题需要安装很多东西。也可以使用 reshape2 包来完成,并且肯定有人会提供该解决方案。

    编辑

    无需重塑,这是更好的方法......

    x <- table(dat[, -1])
    x %*% t(x)
    
    ##        Company
    ## Company A B C D E
    ##       A 1 1 0 0 0
    ##       B 1 1 0 0 0
    ##       C 0 0 1 0 0
    ##       D 0 0 0 1 1
    ##       E 0 0 0 1 1
    

    如果你真的想要对角线上的零:

    y <- x %*% t(x)
    diag(y) <- 0
    y
    

    【讨论】:

    • 非常感谢您的回复。尝试了第一个建议。收到错误:“不是矩阵对象;结果可能不正确。”这里有什么指示吗?
    • 这不是错误,而是警告。 adjmat 需要一个矩阵对象,如果没有得到它会抛出一个警告。您可以忽略它或使用suppressWarnings 换行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-07
    • 1970-01-01
    • 2016-04-06
    • 1970-01-01
    • 1970-01-01
    • 2020-06-01
    相关资源
    最近更新 更多