如何做正则表达式来匹配一个数字,然后在 R 中同时乘以一个大列表的数字?

How to do regex to match a number and then multiply the number at the same time for a large list in R?

我有一些数据,例如 c("1k", "2k", "1.5k" ...),我想将 ks 转换为 c("1000", "2000", "1500", ...),gsub 在替换大列表时速度相当快,但它无法匹配11.5 然后乘以 1000

我可以匹配 (\d+(.\d{1})?[Kk])(\d+(.\d{2})?[Kk])(\d+(.\d{3})?[Kk]) 并替换它们,但它看起来像是一种蛮力方法,所以我想看看有没有其他方法可以快点加号再算?

我尝试提取数字然后将它们相乘然后遍历列表并单独执行 gsub 但它非常慢。

非常感谢。

请注意,字符串可以是 ' 1k''display price: 1k''1k - 2k' 和其他一些随机字符等。我们总是希望获得第一个出现的价格,因此对于 1k - 2k 案例我们想要得到 1k。 而且还有数百万行,因此当多次进行替换时,性能可能会变差。

我们创建一个命名的 vector,提取数字部分并与替换的非数字部分相乘

unname(as.numeric(gsub("[A-Za-z]+", "", v1)) *
     setNames(c(1e3, 1e6), c('k', 'm'))[sub("[0-9.]+", "", v1)])
#[1]    1000    2000    1500 1700000

数据

v1 <- c("1k", "2k", "1.5k", '1.7m')

要删除随机字符,首先要删除除数字、点、k 和 K 之外的所有字符,然后用 e3 替换 k 或 K 及其后的所有字符。最后它将剩下的转换为数字。

x <- c("1k", "2k", "1.5k", "   6K", "1k - 2k")
as.numeric(sub("k.*", "e3", gsub("[^0-9.kK]", "", x), ignore.case = TRUE))
## [1] 1000 2000 1500 6000 1000
x = c("1k", "2k", "1.5k", "1k - 2k", "1m", "display price: 1k")
as.numeric(sub(".*(\d+)k.*", "\1", x)) * 1000
#[1] 1000 2000 5000 2000   NA 1000
#Warning message:
#NAs introduced by coercion