【发布时间】:2015-03-27 19:05:35
【问题描述】:
正如标题所述,我正在尝试在 data.table 中创建一个列,该列将充当另一列的唯一标识符。我的数据集是几亿个观察值,但这里有一个游戏集和我目前编写的代码:
# I use a key because there are many more columns, but they are irrelevant here
myDT <- data.table(Addy=c("12hig", "12hig", "12hig", "1AbHN", "198aM"),key="Addy")
Addy
1: 12hig
2: 12hig
3: 12hig
4: 198aM
5: 1AbHN
uniqueDT <- unique(myDT[,list(Addy)]) # is this inefficient?
uniqueDT[,mrpId := seq(1,nrow(uniqueDT),1)]
Addy mrpId
1: 12hig 1
2: 198aM 2
3: 1AbHN 3
myDT[J(uniqueDT)]
Addy mrpId
1: 12hig 1
2: 12hig 1
3: 12hig 1
4: 198aM 2
5: 1AbHN 3
我上面的代码完成了工作,但我真的不知道它是否有效。有没有更多的data.table-esque 方式来做到这一点?
编辑:
您可能想知道为什么我要从唯一标识符创建唯一标识符。好吧,这里的想法基本上是创建一个哈希。 'Addy' 列数据是很长的字符串,我需要对这些数据进行操作,所以我认为最好对较少的字节数进行操作。
【问题讨论】:
-
至于您更大的问题,如果您将
Addy设置为您的密钥(您可能应该这样做),我有点怀疑您是否会通过使用替代方案获得很多加速包含完全相同的分组信息的列。我的强烈猜测(但这只是一个猜测)是在幕后——无论它们包含非常短还是非常长的字符串——任何两个键控列都使用相同的机制来标识、子集和操作数据的子组。表。 -
有趣,我会记住这一点。但到目前为止,在 R 中进行了一些操作后,数据被导出到内存效率不如
data.table的其他程序。 -
@frank 是的,Matt Dowle 的最终编辑涵盖了这一点。但是我搜索了这个问题并没有找到那个问题,或者这个问题:stackoverflow.com/questions/28910376/…
-
@mrp 我的意思不是把欺骗票当成批评。我也赞成你的问题。很好地找到了其他问题。
标签: r data.table