如何使用正则表达式匹配一个数字,然后同时将该数字乘以R中的一个大列表?

如何使用正则表达式匹配一个数字,然后同时将该数字乘以R中的一个大列表?,r,etl,R,Etl,我有一些数据,例如c1k,2k,1.5k…,希望tp将ks转换为c1000,2000,1500…,gsub在替换大型列表时相当快,但它无法匹配1或1.5,然后乘以1000 我可以匹配\d+。\d{1}?[Kk]、\d+。\d{2}?[Kk]、\d+。\d{3}?[Kk]并替换它们,但这看起来像是一种蛮力方法,所以我想看看是否有其他方法可以快速增加数字,然后进行计算 我试着提取数字,然后将它们相乘,然后在列表中循环,并单独进行gsub,但速度非常慢 非常感谢 请注意,字符串可以是“1k”,“显示价

我有一些数据,例如c1k,2k,1.5k…,希望tp将ks转换为c1000,2000,1500…,gsub在替换大型列表时相当快,但它无法匹配1或1.5,然后乘以1000

我可以匹配\d+。\d{1}?[Kk]、\d+。\d{2}?[Kk]、\d+。\d{3}?[Kk]并替换它们,但这看起来像是一种蛮力方法,所以我想看看是否有其他方法可以快速增加数字,然后进行计算

我试着提取数字,然后将它们相乘,然后在列表中循环,并单独进行gsub,但速度非常慢

非常感谢

请注意,字符串可以是“1k”,“显示价格:1k”,“1k-2k”和其他一些随机字符等。我们总是希望得到第一个价格,因此对于1k-2k的情况,我们希望得到1k。 而且还有数以百万计的行,因此在多次进行替换时,性能可能会变得更差。

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

unname(as.numeric(gsub("[A-Za-z]+", "", v1)) *
     setNames(c(1e3, 1e6), c('k', 'm'))[sub("[0-9.]+", "", v1)])
#[1]    1000    2000    1500 1700000
数据
要删除随机字符,首先删除除数字、点、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

可能重复?如何转换1k-2k?在这种情况下,预期的输出是什么?@jdobres因此,如果有1k-2k,我们只想得到第一个1kHi@thelatemail,谢谢你指出,它是相似的,但略有不同,这里的价格将在价格编号前后随机出现一些字符。嗨,akrun,谢谢你的建议,对不起,我忘了提到原始价格也会有一些随机字符。我认为如果价格中没有其他随机字符,这将很有效,不幸的是,由于数据的质量,它还包含一些其他随机字符。嗨,akrun,对不起,我再举一些例子,thanksHi@d.b,谢谢你的建议,我试过,它在大多数情况下都有效,但在“显示价格:1k”这样的情况下不起作用,有没有办法解决价格前后的随机字符?谢谢你,谢谢你。我抄了那两行,但它给了我错误的答案1000 2000 5000 2000 NA 1000
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