我有一个4 GB的文件,带有大约20亿个有向边缘,格式为User1 Follows User 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这样没有 friend 或关注者,但他们自己关注人的情况。

我宁愿不必遍历整个过程,因为这将永远占用我有多少条边。

是否有任何快速有效地做到这一点的有效方法?

谢谢!

最佳答案

这是一种方法:

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]列出 friend 。

这接近以表格格式理智地处理此数据的极限。任何爱好者,您都会真正想要一张图表。请参阅igraph程序包。

什锦笔记:
  • 语法DT[i,j,by]表示使用i的子集;按by分组;并执行j。参见?data.table
  • 任务可以像DT[...][...]一样链接。
  • :=是用于分配给列的特殊符号。
  • .N是一个特殊变量,用于计算组中的行。参见?.N
  • on=nomatch=中使用i的“join”时的辅助参数。
  • ?data.table是用于从长格式更改为宽格式的帮助器函数。参见dcast
  • 关于r - 从很大的边缘列表中快速计算单向,双向链接的数量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42542675/

    10-12 17:24
    查看更多