首页 文章

如何在数据帧中 Build 用户网络?

提问于
浏览
0

嗨,我是新来的r我有一个问题,即从一个名为w2的数据框中找到用户(uID)和文章网络(faID)的网络

faID      uID
  1        1256
  1        54789
  1        547821
  2        3258
  2        4521
  2        4528
  3        98745
  3        1256
  3        3258
  3        2145

这只是一个例子,我有超过20000篇文章,我希望根据数据框格式的文章在用户之间 Build 关系,例如

**##for article one##**


1258  54789
1258  547821
47789 547821 

**##similarly for article 2##**

3258  4521
3258  4528
4528  4521

我使用稀疏矩阵格式,但r内存不允许我找到用户和文章的网络和中心分数 . 任何帮助都将非常受欢迎 . 其他一些信息是dput(head(w2,))结构( list(faID = c(1L,1L,1L,1L,1L,1L),uID = c(20909L,6661L,1591L,28065L,42783L,3113L)) . . Name = c(“faID”,“uID”) ,row.names = c(7L,9L,10L,12L,14L,16L),class = data.frame“)

昏暗(w2)[1] 364323 2

1 回答

  • 1

    以下是关于如何为邻接构造 data.frame 的问题的一个答案(在许多可能的解决方案中)

    user -- (article) -- user
    

    使用 dplyr

    library( dplyr )
    edges <- tbl_df( tab ) %>% 
      group_by( article ) %>%
      do( {    
        tmp <- combn( sort(.$user),  m = 2 )
        data.frame( a = tmp[1,], b = tmp[2,], stringsAsFactors = FALSE )
      } ) %>%
      ungroup
    

    这使

    Source: local data frame [12 x 3]
    
       article  a  b
    1        1 u1 u2
    2        1 u1 u3
    3        1 u2 u3
    4        2 u2 u4
    ...
    

    如果您想总结两个用户共有多少篇文章,可以通过以下方式完成:

    edges <- edges %>%
      group_by( a, b ) %>%
      summarise( article_in_common = length(article) ) %>%
      ungroup
    
    Source: local data frame [6 x 3]
    
       a  b article_in_common
    1 u1 u2                 1
    2 u1 u3                 1
    3 u1 u4                 1
    4 u1 u6                 1
    ...
    

    请注意,这是可能的,因为您在调用 combn 之前对用户进行了编辑 .

    从这些数据中,您可以轻松构建 igraph 对象:

    library(igraph)
    g <- graph.data.frame( select(edges, a, b, weight = article_in_common), directed = FALSE )
    
    plot(g)
    

    enter image description here

    在此图表中,您可以调用任何可用的中心或社区度量 . 例如,参见 ? centralize.scores .

相关问题