将电影票房转换为数字

Converting Movie Box Office to Numbers

我在 R 中有一个数据框,列出的票房数字为 $121.5M 和 $0.014M,我想将它们转换为直接数字。我正在考虑拆分 $ 和 M,然后使用基本乘法。有一个更好的方法吗?

您可以通过匹配非数字元素 ([^0-9.]*) 并将其替换为 ''

来做到这一点
 as.numeric(gsub("[^0-9.]*", '', "1.5M"))
 #[1] 121.5

或者通过专门匹配 $M ([$M]) 并将其替换为 ''

 as.numeric(gsub("[$M]", '',"1.5M"))
 #[1] 121.5

更新

如果你有像下面这样的向量

v1 <- c(".21M", "[=12=].5B", "0K", "T", "[=12=].9P", ".5K") 

用数字创建另一个向量并用相应的缩写设置名称

v2 <- setNames(c(1e3, 1e6, 1e9, 1e12, 1e15), c('K', 'M', 'B', 'T', 'P'))

使用它作为索引来替换缩写并将其与向量的数字部分相乘。

 as.numeric(gsub("[^0-9.]*", '',v1))* v2[sub('[^A-Z]*', '', v1)]

这将删除 $ 并将 KM 转换为 e3e6。在 gsubfn vignette 中有一个与此非常相似的示例。

library(gsubfn)
x <- c(".21M", "0K")  # input

ch <- gsubfn("[KM$]", list(K = "e3", M = "e6", "$" = ""), x)
as.numeric(ch)
## [1] 1210000  100000

如果不需要转成数字,as.numeric行可以省略。

tidyr 包中的函数 extract_numeric 从字符串和 returns 中去除所有非数字字符和数字。以你的例子:

library(tidyr)
dat <- data.frame(revenue = c("1.5M", "[=10=].014M"))
dat$revenue2 <- extract_numeric(dat$revenue)*1000000

dat
  revenue  revenue2
1 1.5M 121500000
2 [=10=].014M     14000