如何做正则表达式来匹配一个数字,然后在 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 在替换大列表时速度相当快,但它无法匹配1
或 1.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
我有一些数据,例如 c("1k", "2k", "1.5k" ...)
,我想将 ks 转换为 c("1000", "2000", "1500", ...)
,gsub 在替换大列表时速度相当快,但它无法匹配1
或 1.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