我有一个30M行的数据集。一些列包括ID字段,它们只是非常大的整数。 E.g。
library(data.table)
dt <- data.table(SomeID = c(8762438732197823423,
1236487432893428732,
290234987238237842))
我怀疑减少这些ID的大小会加快我的数据的连接和其他进程。这样做的好方法是什么?例如,我可以将唯一ID映射到{1,2,3 ...}或{A,B,C,...}。还不确定哪种数据类型(整数或字符?)最适合存储这些ID字段。
答案 0 :(得分:0)
R中整数的最大大小为2^31 - 1
,即2147483647.大于此值的整数可以存储在双精度数中,但正如@Roland指出的那样,有效数字的精度有限制为53位,因此可以准确存储的最大整数是2^53
。试试2^53 - (2^53 - 1)
即可获得1.尝试(2^53 + 1) - 2^53
,你就会得到0。
对于您的原始问题,如果您正在讨论使用data.table连接,则其中没有太多内容:
library("data.table")
library("microbenchmark")
f <- d <- a <- data.table(x = runif(100, 0, 2^53 - 1), y = rnorm(100))
g <- e <- b <- data.table(x = sample(a$x, 40), z = rnorm(40))
d$x <- sample(1:100)
e$x <- d$x[match(b$x, a$x)]
f$x <- as.character(f$x)
g$x <- as.character(g$x)
setkey(a, x)
setkey(b, x)
setkey(d, x)
setkey(e, x)
setkey(f, x)
setkey(g, x)
microbenchmark(a[b], d[e], f[g], times = 1000L)
##Unit: microseconds
## expr min lq mean median uq max neval
## a[b] 569.079 623.0495 696.8870 649.4150 699.8465 4160.852 1000
## d[e] 570.141 621.2795 719.7463 647.6455 708.5170 5305.024 1000
## f[g] 549.968 598.4520 665.4203 622.8720 674.1880 3667.156 1000
如果您想这样做,您可以使用包含旧ID和新ID的列创建新的data.frame或data.table,然后使用上面代码中所示的match
函数来更改ids over。