2013-04-17 70 views
3

是否有一个快速的算法/函数将字符串转换为整数R中[R创建一组字符串数据的唯一密钥

我有一个数据帧貌似

id_1 id_2 id_3 date  value 
1  2 3 2012-11-18 50 
1  1 4 2012-05-07 100 

strtoi(paste(df[,1],df[,3],df[,4],sep='_')给了我一个NA

试图建立一个唯一的主键,我可以用来做一些基本的算术

感谢

+0

你不能使用(我假设你的数据框被称为'mydf')类似'mydf $ KEY < - seq_len(nrow(mydf))''。这可以保证给你一个从一个开始的数字整数序列(如果你的数据框中有任何行),并以数据库中的行数为结尾? –

+0

谢谢@ SimonO101我需要他们准确地引用相同的文本序列,即使他们在不同的数据框中以不同的顺序排序,所以摘要对我来说在这里更好。 –

+0

太好了。那么我很高兴你有一些很好的解决方案! –

回答

6

使用digest

library(digest) 
temp <- data.frame(x1=c(1:5,1),x2=c(2:6,2),stringsAsFactors=FALSE) 
temp <- data.frame(temp, uid = apply(temp, 1, digest),stringsAsFactors=FALSE)) 
+3

完美,或者我应该说“dd647c3f2728e9355f760525508a50db”谢谢@lokheart –

5

digest作为@lokheart指出的是巨大的。

另一种选择是简单地使用factor s。 factor也是数字。你可以通过as.numeric强制获得数值。

kvpairs <- factor(apply(X, 1, paste, collapse="")) 

现在,您已在级别(concat'd行字符串)和基础数值之间进行配对。

# the numeric key of the first value 
> as.numeric(kvpairs)[[1]] 
[1] 2 

# the value of key==2 
> levels(kvpairs)[2] 
[1] "1232012-11-18 50" 


> kvpairs 
[1] 1232012-11-18 50 1142012-05-07100 
Levels: 1142012-05-07100 1232012-11-18 50 

请注意,如果添加重复行,它将具有相同的级别(级联时)。

+0

谢谢@RicardoSaporta这也会起作用。如果在不同的数据框架中因素顺序不同,或者缺少某些因素,我不确定是否会得到相同的因子值。 –

+0

@TahnoonPasha,如果顺序不同,是的,你仍然会得到相同的因素。但是,如果缺少值然后否,您将得到不同的因素。 –

4

另一个选项来创建每行的唯一关键是使用interaction,例如:

transform(dat,id =interaction(dat)) 

id_1 id_2 id_3  date value     id 
1 1 2 3 2012-11-18 50 1.2.3.2012-11-18.50 
2 1 1 4 2012-05-07 100 1.1.4.2012-05-07.100 

编辑

默认behvior是保留所有因子水平。在这里最好使用drop = TRUE,所以未使用的因子水平从结果中删除。

transform(dat,id =interaction(dat,drop=TRUE)) 

    id_1 id_2 id_3  date value     id 
    1 1 2 3 2012-11-18 50 1.2.3.2012-11-18.50 
    2 1 1 4 2012-05-07 100 1.1.4.2012-05-07.100 
+1

谢谢@agstudy –

+0

我不知道这里'交互'如何与'apply(dat,1,paste,collapse =“。”)不同地使用' –

+0

@RicardoSaporta我不确定我们是否可以在这里比较2 ? '交互作用'计算一个因素,'粘贴'只是为了创建一个字符串(之后你强迫它)。所以我很困惑为什么这个评论?说这个解决方案与你的解决方案相同?:) – agstudy