情况是这样的我有一个8500万行的表,有18列。其中三列的值采用公制前缀/ SI表示法(参见Wikipedia上的Metric Prefix)。
这意味着我有这样的数字:
- .1M而非100000或1 e +5,或
- 1 K而不是1000或1 e +3
示例数据。表是
V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18
1: 2014-03-25 12:15:12 58300 3010 44.0 4.5 0.0 0 0 0.8 50 0.8 10K 303 21K 0 a 56
2: 2014-03-25 12:15:12 56328 3010 28.0 12.0 0.0 0 0 0.3 60 0.0 59 62 .1M 0 a 66
3: 2014-03-25 12:15:12 21082 3010 10.0 1.7 0.0 0 0 14.0 72 0.3 4K 208 8K 1 a 80
4: 2014-03-25 12:15:12 59423 3010 12.0 0.0 0.2 0 0 88.0 0 0.0 20 16 71 0 a 26
5: 2014-03-25 12:15:12 59423 3010 9.6 1.4 0.0 0 0 60.0 29 0.2 2K 251 6K 0 a 56
6: 2014-03-25 12:15:12 24193 3010 8.3 1.9 0.0 0 0 9.9 80 0.3 3K 264 8K 1 a 71
7: 2014-03-25 12:15:12 21082 3010 7.1 1.7 0.4 0 0 6.3 83 0.3 3K 197 7K 0 a 71
8: 2014-03-25 12:15:12 59423 3010 4.6 1.2 0.0 0 0 57.0 37 0.1 998 81 7K 0 a 118
我修改了Hans-Jörg Bibiko写的一个函数,他用它来修改ggplot 2的比例。网站here如果你感兴趣。我最终使用的函数是:
sitor <- function(x)
{
conv <- paste("E", c(seq(-24 ,-3, by=3), -2, -1, 0, seq(3, 24, by=3)), sep="")
names(conv) <- c("y","z","a","f","p","n","µ","m","c","d","","K","M","G","T","P","E","Z","Y")
x <- as.character(x)
num <- function(x) as.numeric(
paste(
strsplit(x,"[A-z|µ]")[[1]][3],
ifelse(substr(paste(strsplit(x,"[0-9|\\.]")[[1]], sep="", collapse=""), 1, 1) == "",
"",
conv[substr(paste(strsplit(x,"[0-9|\\.]")[[1]], sep="", collapse=""), 1, 1)]
),
sep=""
)
)
return(lapply(x,num))
}
我将其应用于by数据表,以更新3列,如
temp[ ,`:=`(V13=sitor(V13),V14=sitor(V14),V15=sitor(V15)) ]
我已经将data.table键向量应用于临时表,
setkeyv(temp,c("V1","V2","V3","V18"))
61分钟后,我仍然在这里等待结果...鉴于我的数据大小即将增长4到5倍,关于如何加快这种转换的一些提示将非常方便。
3条答案
按热度按时间baubqpgj1#
你为什么不试试
sitools
库?**EDIT:**这是一个基于数据表的函数,可以从
sitools
包中反转f2si
:p4tfgftt2#
这里有一个方法,在我的计算机上大约需要10秒来转换一个具有10M值的向量。您可以将其扩展到涵盖更多的“K”,“M”和“G”
jtoj6r0c3#
所有其他答案对我来说都不适合NA(或者产生警告,这也不好)。
这是我的解决方案,它重用了其他解决方案中的一些位。