是否有快速算法/函数将字符串转换为 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 中的整数
我有一个数据框看起来像
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))
digest
正如@lokheart 指出的那样很棒。
另一种选择是简单地使用factor
s。 factor
s 也是数字。您可以通过强制获取它们的数值as.numeric
。
kvpairs <- factor(apply(X, 1, paste, collapse=""))
现在您在级别(连接的行字符串)和基础数值之间进行了配对。
# 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
请注意,如果添加重复行,它将具有相同的级别(连接时)。
为每行创建唯一键的另一个选项是使用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
编辑
默认行为是保留所有因子水平。最好在这里使用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