将单位缩写转换为数字

Mic*_*efe 4 r units-of-measurement exponent

我有一个在列中缩写数值的数据集。例如,12M表示1200万,1.2k表示1200。M和k是唯一的缩写。如何编写允许R将这些值从最低到最高排序的代码?

我虽然已经使用gsub将M转换为000,000等,但这并没有考虑到小数点(1.5M将是1.5000000)。

smc*_*mci 5

  • 因此,您想将SI单位缩写(“ K”,“ M”,...)转换为指数,从而将其转换为十进制的幂。假设所有单位都是单字母,并且指数是10 ** 3的均等幂,以下是处理“ Kilo” ...“ Yotta”以及所有未来指数的工作代码:
    > 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