【发布时间】:2016-08-18 22:39:09
【问题描述】:
我有一个包含多个社交媒体用户及其关注者的数据表。原始数据表格式如下:
X.USERID FOLLOWERS
1081 4053807021,2476584389,4713715543, ...
因此,每一行都包含一个用户及其 ID 和一个关注者向量(用逗号分隔)。我总共有 24,000 个唯一用户 ID 和 160,000,000 个唯一关注者。我希望将我的原始表格转换为以下格式:
X.USERID FOLLOWERS
1: 1081 4053807021
2: 1081 2476584389
3: 1081 4713715543
4: 1081 580410695
5: 1081 4827723557
6: 1081 704326016165142528
为了得到这个数据表,我使用了下面这行代码(假设我原来的数据表叫dt):
uf <- dt[,list(FOLLOWERS = unlist(strsplit(x = FOLLOWERS, split= ','))), by = X.USERID]
但是,当我在整个数据集上运行此代码时,我收到以下错误:
不允许负长度向量
根据这篇关于堆栈溢出的帖子 (Negative number of rows in data.table after incorrect use of set),我似乎遇到了 data.table 中列的内存限制。作为一种解决方法,我以较小的块(每 10,000 个)运行代码,这似乎有效。
我的问题是:如果我更改我的代码,我是否可以防止此错误发生,或者我是否遇到了 R 的限制?
PS。我有一台 140gb RAM 的机器可供使用,所以物理内存空间不应该是问题。
> memory.limit()
[1] 147446
【问题讨论】:
-
您可以尝试寻找
strsplit的替代品,因为这可能是您查询效率最低的部分。 -
stringi包中的stri_split在我对一个具有 100 个 ID 和每个 ID 100,000 个关注者的虚假数据文件进行测试时,速度提高了大约 3 倍。 -
“关注者”的总数比唯一关注者更重要...您的 140 GB 可能在您加载初始表之前就被炸毁了
标签: r data.table bigdata