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

时间:2014-07-23 08:08:31

标签: r

嗨我是新来的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篇文章  我希望基于数据框格式的文章在用户之间建立关系,例如

**##for article one##**


1258  54789
1258  547821
47789 547821 

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

3258  4521
3258  4528
4528  4521

我使用稀疏矩阵格式但是r内存不允许我找到用户和文章的网络和中心分数。任何帮助都将受到高度赞赏。其他一些信息是 dput(头(W2)) 结构(列表(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 个答案:

答案 0 :(得分: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
...

请注意,这是可行的,因为您在调用sort之前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