R中字母到数字的映射
我有一个由R中字母到数字的映射,r,R,我有一个由n字母组成的字符串向量,例如“ABCDEF” 我需要把这个映射到某个唯一的数字。当然,直观的方法是提取所有单个字母字母,然后通过 match(letter,LETTERS) 但这会导致对于大的n,数字太大,因为每个字母(从01到26)需要两位数字 我现在的想法是将字符串的每个组合与1和26^n之间的唯一数字相匹配,利用26^n的大n的位数少于2n这一事实 例如,对于n=4我们得到“AAAA”->1和“ZZZZ”->26^4 我怎样才能在R中做到这一点?我想你应该像下面这样对字母进行编
n
字母组成的字符串向量,例如“ABCDEF”
我需要把这个映射到某个唯一的数字。当然,直观的方法是提取所有单个字母字母,然后通过
match(letter,LETTERS)
但这会导致对于大的n
,数字太大,因为每个字母(从01
到26
)需要两位数字
我现在的想法是将字符串的每个组合与1
和26^n
之间的唯一数字相匹配,利用26^n
的大n
的位数少于2n
这一事实
例如,对于n=4
我们得到“AAAA”->1
和“ZZZZ”->26^4
我怎样才能在R中做到这一点?我想你应该像下面这样对字母进行编码
f <- function(letter) sum((match(unlist(strsplit(letter,"")),LETTERS)-1)*26**((nchar(letter)-1):0))+1
虽然这可能很聪明,但使用因子可能更简单,也更容易理解。您还可以将字符串格式保持在手边,同时将其编码为整数可以节省空间
如果数据库中需要整数(这将更好地进行联接),则可以使用as.integer(factor\u column)
将因子强制转换为int,还可以使用整数变量
您将失去的是映射的确定性,如果这不仅仅是一次性的数据加载,那么它在DB世界中可能对您很重要。向量中的字符串也是唯一的吗?是的,但是当新数据进来时它应该工作,所以排序不会完成。这里已经有一个函数用于此,请尝试:charToRaw(“ABCDEF”)
@zx8754但这并不能保存数字,我仍然需要每一个字母两个,这可能不清楚,但我的意思是:26^n
比2n
大的n
数字少,这是真的,但我需要数字,因为数据将被读入数据库,每个人都告诉我,用整数而不是字符进行连接更有效。因此,基本上,我试图唯一地映射到整数,同时使数字尽可能小(否则R无法处理)
> f("AAAA")
[1] 1
> f("AABC")
[1] 29
> f("ZZZZ")
[1] 456976