gpt4 book ai didi

r - 将单位缩写转换为数字

转载 作者:行者123 更新时间:2023-12-04 10:38:54 33 4
gpt4 key购买 nike

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

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

最佳答案

  • 因此,您想将 SI 单位缩写('K'、'M'、...)转换为指数,从而转换为 10 的数字幂。
    鉴于所有单位都是单字母,并且指数是均匀间隔的 10**3 次幂,这里是处理“Kilo”...“Yotta”和任何 future 指数的工作代码:
  •     > 10 ** (3*as.integer(regexpr('T', 'KMGTPEY')))
    [1] 1e+12

    然后只需将该十的幂乘以您拥有的十进制值。
  • 此外,您可能想要检测和处理未知字母前缀的“不匹配”情况,否则您会得到一个无意义的 -1*3
  •     > unit_to_power <- function(u) {
    exp_ <- 10**(as.integer(regexpr(u, 'KMGTPEY')) *3)
    return (if(exp_>=0) exp_ else 1)
    }
  • 现在,如果您想不区分大小写将 'k' 和 'K' 匹配到 Kilo(计算机人员经常写的,即使这在技术上是对 SI 的滥用),那么您需要特殊情况,例如 if- else 阶梯/表达式(SI 单位通常区分大小写,“M”表示“Mega”,但“m”严格表示“milli”,即使磁盘驱动器用户另有说明;大写通常用于正指数)。所以对于一些前缀,@DanielV 的 case-specific 代码更好。
  • 如果您也需要负 SI 前缀,请使用 as.integer(regexpr(u, 'zafpnum@KMGTPEY')-8)哪里@只是保持均匀间距的一些一次性字符,它实际上不应该匹配。同样,如果您需要处理非 10**3 次幂的单位,如“deci”、“centi”,则需要特殊 shell ,或者 WeNYoBen 使用的基于 dict 的一般方法。
  • base::regexpr没有矢量化,它在大输入上的性能也很差,所以如果你想矢量化并获得更高的性能,请使用 stringr::str_locate .
  • 关于r - 将单位缩写转换为数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56159114/

    33 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com