优雅地将 1M 转换为 1000000 [英] Converting 1M to 1000000 elegantly

查看:16
本文介绍了优雅地将 1M 转换为 1000000的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我要转换:

library(data.table)
market.cap <- data.table(cap=c("1B", "10M", "2M"))

  cap
1  1B
2 10M
3  2M

到:

      cap
1 1000000000
2   10000000
3    2000000

这是我的解决方案.它有效,但涉及添加一列,我知道这不是必需的.有什么更好的方法?

Here's my solution. It works, but involves adding a column, which I know isn't necessary. What's a better way?

market.cap[, cap1 := cap]
market.cap$cap = sapply(market.cap$cap, function(x) (as.numeric(temp <- gsub("B", "", x)) * 1000000000))
market.cap$cap1 = sapply(market.cap$cap1, function(x) (as.numeric(temp <- gsub("M", "", x)) * 1000000))
M = data.frame(x = na.omit(market.cap$cap))
B = data.frame(x = na.omit(market.cap$cap1))
rbind(M,B)

推荐答案

这是我自己的尝试:

market.cap[ , cap1 := {
  sf <- gsub("[0-9]", "", cap)
  as.numeric(gsub("[^0-9]", "", cap)) * 1000 ^ (2 + (sf == "B"))}]

以下方法可能会更快,因为它不需要浪费精力通过正则表达式运行 cap 两次:

The following approach may prove faster since it doesn't need to waste effort on running cap through a regex twice:

market.cap[ , cap1 := {
  x<- do.call("rbind", strsplit(cap, split = "(?=[BM])", perl = TRUE))
  as.numeric(x[ , 1L]) * 1000 ^ (2 + (x[ , 2L] == "B"))}]

由于 tstrsplit 已在 data.table 中进行了优化,以下可能会证明是最快的:

And the following may prove fastest since tstrsplit has been optimized in data.table:

market.cap[ , cap1 := {
  x <- tstrsplit(cap, split = "(?=[BM])", perl = TRUE)
  as.numeric(x[[1L]]) * 1000 ^ (2 + (x[[2]] == "B"))}]

这篇关于优雅地将 1M 转换为 1000000的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆