r语言 - 从非常大的边缘列表中快速计算单向、双向链接的数量



>我有一个 4 GB 的文件,其中包含大约 20 亿条有向边,格式为 User1 跟随用户 2,如下所示。

User1       User2
7           37
5           24
7           8383932
24          1
3           8538
37          7
DF = structure(list(User1 = c(7L, 5L, 7L, 24L, 3L, 37L), User2 = c(37L, 
24L, 8383932L, 1L, 8538L, 7L)), .Names = c("User1", "User2"), row.names = c(NA, 
-6L), class = "data.frame")

等等。 我希望能够有效地获得以下结果

User        NumberFollowers        NumberFriends
1           1                      0
7           1                      1
24          1                      0
37          1                      1
8383932     1                      0
8538        1                      0
5           0                      0
3           0                      0

依此类推,其中 NumberFollowers 是带有链接的"User1"的数量,而 NumberFriends 是他们拥有的关注者的数量,他们也相互关注。

我目前尝试使用

aggregate()

然而,它似乎忽略了像用户 5 和用户 3 这样的情况,他们没有朋友或追随者,但他们自己关注人。

我宁愿不必遍历整个事情,因为我有多少条边缘需要很长时间。

有没有一种好的、有效的方法可以相对快速、轻松地做到这一点?

谢谢!

这是一种方法:

library(data.table)
setDT(DT)
res0 <- rbind(
DT[, .N, by=.(user=User2)][, lab := "followers"],
DT[.(User2, User1), on=names(DT), nomatch=0][, .N, by=.(user=User2)][, lab := "friends"]
)[, dcast(.SD, user ~ lab, value.var = "N", fill = 0L)]
user followers friends
1:       1         1       0
2:       7         1       1
3:      24         1       0
4:      37         1       1
5:    8538         1       0
6: 8383932         1       0

这不包括没有关注者的用户,但如果需要,他们可以相当简单地添加回来。

DT本身列出了关注者;DT[.(User2, User1), on=names(DT), nomatch=0]列出了朋友。

这接近人们可以理智地处理表格格式的数据的极限。任何更花哨的东西,你都会真正想要一个图表。请参阅 igraph 包。


各种笔记:

  • 语法DT[i,j,by]表示使用i的子集;按by分组;并执行j。请参阅?data.table
  • 任务可以像DT[...][...]一样链接。
  • :=是用于分配给列的特殊符号。
  • .N是一个特殊变量,用于计算组中的行数。请参阅?.N
  • on=nomatch=是使用i进行"连接"时的辅助参数,同样在?data.table中。
  • dcast是一个辅助函数,用于从长格式重塑为宽格式。请参阅?dcast

最新更新