Why don't you try sitools
library?
library(data.table)
dt<-data.table(var = sample(x=1:1e5, size=1e6, replace=T))
library(sitools)
> system.time(dt[, var2 := f2si(var)])
user system elapsed
10.08 0.09 10.89
EDIT: this is a data.table based function that reverse f2si
from sitools
package:
si2f<-function(x){
if(is.numeric(x)) return(x)
require(data.table)
dt<-data.table(lab=c("y","z","a","f","p","n","µ","m","c","d","", "da", "h", "k","M","G","T","P","E","Z","Y"),
mul=c(1e-24, 1e-21, 1e-18, 1e-15, 1e-12, 1e-9, 1e-6, 1e-3, 1e-2, 1e-1, 1L, 10L, 1e2, 1e3, 1e6, 1e9, 1e12, 1e15, 1e18, 1e21, 1e24),
key="lab")
res<-as.numeric(gsub("[^0-9|\\.]","", x))
x<-gsub("[0-9]|\\s+|\\.","", x)
.subset2(dt[.(x)], "mul")*res
}
> system.time(dt[, var3 := si2f(var2)])
user system elapsed
13.18 0.03 13.31
> dt[, all.equal(var,var3)]
[1] TRUE