我有一个包含多个社交媒体用户和他/她的粉丝的数据表。原始数据表格式如下:
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
答案 0 :(得分:0)
当数据集中的行数超过R的限制为2 ^ 32-1时,会出现此问题。 处理此问题的方法之一是以块(在循环内)读取数据集。 看起来您的文件按X.USERID字段排序,因此您的块(当您读取文件时)应该与唯一关注者的数量重叠,以确保每个用户属于至少一个包含所有关注者的块。 处理这些块的方式在很大程度上取决于您需要对数据执行的操作。