是否有一个快速的算法/函数将字符串转换为整数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
试图建立一个唯一的主键,我可以用来做一些基本的算术
感谢
是否有一个快速的算法/函数将字符串转换为整数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
试图建立一个唯一的主键,我可以用来做一些基本的算术
感谢
使用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))
完美,或者我应该说“dd647c3f2728e9355f760525508a50db”谢谢@lokheart –
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
请注意,如果添加重复行,它将具有相同的级别(级联时)。
谢谢@RicardoSaporta这也会起作用。如果在不同的数据框架中因素顺序不同,或者缺少某些因素,我不确定是否会得到相同的因子值。 –
@TahnoonPasha,如果顺序不同,是的,你仍然会得到相同的因素。但是,如果缺少值然后否,您将得到不同的因素。 –
另一个选项来创建每行的唯一关键是使用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
谢谢@agstudy –
我不知道这里'交互'如何与'apply(dat,1,paste,collapse =“。”)不同地使用' –
@RicardoSaporta我不确定我们是否可以在这里比较2 ? '交互作用'计算一个因素,'粘贴'只是为了创建一个字符串(之后你强迫它)。所以我很困惑为什么这个评论?说这个解决方案与你的解决方案相同?:) – agstudy
你不能使用(我假设你的数据框被称为'mydf')类似'mydf $ KEY < - seq_len(nrow(mydf))''。这可以保证给你一个从一个开始的数字整数序列(如果你的数据框中有任何行),并以数据库中的行数为结尾? –
谢谢@ SimonO101我需要他们准确地引用相同的文本序列,即使他们在不同的数据框中以不同的顺序排序,所以摘要对我来说在这里更好。 –
太好了。那么我很高兴你有一些很好的解决方案! –