【问题标题】:Creating a unique integer on the basis of a string基于字符串创建唯一整数
【发布时间】:2013-01-14 20:55:07
【问题描述】:

我有一个更大的数据集(大约 9m 行的 data.table),其中有一列我想用来聚合值(最小值和最大值等)。该列是各种其他列的组合,并具有基于字符串的格式,如下所示:

string <- "318XXXX | VNSGN | BIER"

为了提高执行任务的速度,我想将其重新编码为一个唯一的整数。我经常用来处理数据的另一个应用程序有一个内置函数,可以将字符串转换为整数(例如 73823)。我想知道R中是否有类似的功能?这个想法是一个特定的字符串总是会产生相同的整数。这将允许它用于合并 data.tables 等。

下面是我想用简单整数值编码的 data.table 列的一个小例子:

sample <- c("318XXXX | VNSGN | BIER", "462XXXX | TZZZH | 9905", "462XXXX | TZZZH | 9905", 
"462XXXX | TZZZH | 9905", "511XXXX | FAWOR | 336H", "511XXXX | FAWOR | 336H", 
"652XXXX | XXXXR | T136", "652XXXX | XXXXR | T136", "672XXXX | BQQSZ | 7777", 
"672XXXX | BQQSZ | 7777")

我希望将字符串编码为表格的附加列,如下所示;请注意,相同的字符串会产生相同的数字。

String                      Number
318XXXX | VNSGN | BIER      19872
462XXXX | TZZZH | 9905      78392
462XXXX | TZZZH | 9905      78392
462XXXX | TZZZH | 9905      78392
511XXXX | FAWOR | 336H      23053
511XXXX | FAWOR | 336H      23053
652XXXX | XXXXR | T136      95832
652XXXX | XXXXR | T136      95832
672XXXX | BQQSZ | 7777      71829   
672XXXX | BQQSZ | 7777      71829

【问题讨论】:

  • ?factor 是否符合您的要求?
  • @Justin:字符串已经在 R 中进行了一段时间的哈希处理,因此因素不会更有效(并且可能会更慢)。但也许 as.integer(factor(sample)) 是 OP 正在寻找的东西?
  • @Justin 在我看来,factor 正在做的事情与我正在尝试做的事情略有不同。例如,?factor 包含以下示例 factor(letters[1:20], labels="letter"),其结果为 letter1 letter2 (...) letter20。我在factor 文档中遗漏了什么吗?我在问题中添加了一个表格,表明我试图完成什么。感谢您的快速回复。
  • 我认为 as.integer(factor(sample)) 实际上就是 Justin 所指的。
  • @joran 你是对的。我想我会把练习的那部分留给读者……

标签: r data.table


【解决方案1】:

data.table 包将为您创建索引,而无需您明确处理它们,因此它比问题中的方法工作量少。请参阅 data.table 中的 setkey 函数。

sqldf 包也可以使用 SQL create index 语句,如 sqldf home page 上的示例 4h 和 4i 一样,几乎可以使用任何数据库包。

【讨论】:

  • 因此,当我在data.table 中使用setkey 时,就没有理由自己将字符串编码为整数值?
猜你喜欢
  • 1970-01-01
  • 2020-12-03
  • 1970-01-01
  • 2016-04-11
  • 1970-01-01
  • 2023-04-03
  • 2019-06-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多