【问题标题】:Create a column of unique identifiers based on another column in data.table [duplicate]基于data.table中的另一列创建唯一标识符列[重复]
【发布时间】: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


【解决方案1】:

这应该很快,并且至少更简单一点:

myDT[, mrpID:=.GRP, by=Addy]
myDT
    Addy mrpID
1: 12hig     1
2: 12hig     1
3: 12hig     1
4: 198aM     2
5: 1AbHN     3

【讨论】:

    【解决方案2】:

    除了data.tablebase factor 类似乎是你需要的:

    myDT[, mrpID:=as.numeric(as.factor(Addy))]
    

    【讨论】:

    • 我尝试过这条路线,但运行as.numeric(as.factor()) 原来是一个相当慢的操作。
    • 另外,在做这样的事情时,你需要采取特殊的措施来保证返回的值是升序的。 (试试这个看看我的意思:as.numeric(as.factor(c("C","B","A")))。)你可以用x &lt;- c("C", "B", "A"); as.numeric(factor(x, levels=unique(x)))解决这个特殊问题
    猜你喜欢
    • 2014-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    • 2021-03-15
    • 1970-01-01
    相关资源
    最近更新 更多