将电影票房转换为数字
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)]
这将删除 $
并将 K
和 M
转换为 e3
和 e6
。在 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
我在 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)]
这将删除 $
并将 K
和 M
转换为 e3
和 e6
。在 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