Mic*_*efe 4 r units-of-measurement exponent
我有一个在列中缩写数值的数据集。例如,12M表示1200万,1.2k表示1200。M和k是唯一的缩写。如何编写允许R将这些值从最低到最高排序的代码?
我虽然已经使用gsub将M转换为000,000等,但这并没有考虑到小数点(1.5M将是1.5000000)。
> 10 ** (3*as.integer(regexpr('T', 'KMGTPEY')))
[1] 1e+12
Run Code Online (Sandbox Code Playgroud)
然后,只需将十进制乘以您的十进制值即可。
-1*3 > unit_to_power <- function(u) {
exp_ <- 10**(as.integer(regexpr(u, 'KMGTPEY')) *3)
return (if(exp_>=0) exp_ else 1)
}
Run Code Online (Sandbox Code Playgroud)
现在,如果您要对Kilo的k和K进行不区分大小写的匹配(就像计算机人经常写的那样,尽管从技术上讲,这是对SI的滥用),那么您将需要特殊情况,例如if-否则,梯形图/表达式(SI单位通常区分大小写,即使磁盘驱动器用户另有说明,“ M”也表示“ Mega”,但“ m”严格表示“ milli”;大写通常用于正指数)。因此,对于一些前缀,@ DanielV的区分大小写的代码更好。
如果您也想使用负SI前缀,请使用as.integer(regexpr(u, 'zafpnum@KMGTPEY')-8)where @仅是一些一次性字符来保持均匀的间距,实际上不应使其匹配。同样,如果您需要处理非10功率3 **单位,例如'deci','centi',则需要特殊外壳或WeNYoBen使用的基于字典的常规方法。
base::regexpr没有向量化,它的性能在大输入上也很差,因此如果要向量化并获得更高的性能,请使用stringr::str_locate。