【问题标题】:Mapping Letters to Numbers in R在 R 中将字母映射到数字
【发布时间】:2020-09-14 08:05:40
【问题描述】:

我有一个由n 字母组成的字符串向量,例如"ABCDEF"

我需要将其映射到某个唯一编号。当然,直观的做法是提取所有单个字母letter,然后通过一个一一匹配到对应的数字

match(letter,LETTERS)

但这会导致大号n 的数字太大,因为每个字母都需要 2 位数字(从 0126)。

我现在的想法是将字符串的每个组合126^n之间的唯一数字相匹配,利用26^n的数字少于2n这一事实大n

例如对于n=4,我们得到"AAAA" -> 1"ZZZZ" -> 26^4

如何在 R 中做到这一点?

【问题讨论】:

  • 向量中的字符串也是唯一的吗?
  • 是的,但是当新数据进来时它应该可以工作,所以排序不会做
  • 已经有这个功能了,试试:charToRaw("ABCDEF")
  • @zx8754 但这并不能保存数字,我仍然需要每个字母两个
  • 也许不清楚,但我的意思是:26^ndigits2nn

标签: r


【解决方案1】:

我猜你想像下面这样对字母进行编码

f <- function(letter) sum((match(unlist(strsplit(letter,"")),LETTERS)-1)*26**((nchar(letter)-1):0))+1

这样

> f("AAAA")
[1] 1

> f("AABC")
[1] 29

> f("ZZZZ")
[1] 456976

【讨论】:

    【解决方案2】:

    虽然这可能很聪明,但使用因子可能更简单,也更容易理解。您还可以将字符串格式保持在手边,同时将其编码为整数来节省空间。

    如果您需要数据库中的整数(这会更好地对它们进行连接),那么您可以使用 as.integer(factor_column) 将因子转换为 int,并且您也将拥有整数变体。

    您将失去的是映射的确定性,如果这不仅仅是一次性数据加载,这对您在 DB 世界中可能很重要。

    【讨论】:

    • 是的,但我需要数字,因为数据将被读入数据库,每个人都告诉我加入整数而不是字符更有效。所以基本上我试图唯一地映射到整数,同时保持数字尽可能小(否则 R 无法处理它)
    猜你喜欢
    • 1970-01-01
    • 2016-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    • 2018-02-13
    • 2021-07-12
    相关资源
    最近更新 更多