【发布时间】:2018-06-17 15:12:33
【问题描述】:
我想将字符串中的 k 替换为 000。例如,我想将“£50k”变成“£50000”。请注意,该函数可以应用于像“£50k king”这样的情况,结果应该是“£50000 king”。
这是我目前所拥有的:
replace_k = function(data){
data = gsub("^[0-9]k", "[0-9]000", data)
return(data)
}
【问题讨论】:
我想将字符串中的 k 替换为 000。例如,我想将“£50k”变成“£50000”。请注意,该函数可以应用于像“£50k king”这样的情况,结果应该是“£50000 king”。
这是我目前所拥有的:
replace_k = function(data){
data = gsub("^[0-9]k", "[0-9]000", data)
return(data)
}
【问题讨论】:
怎么样
data = gsub("([0-9]+)k", "\\1000", data)
【讨论】:
gsub("([0-9]+) mil", "\\1000000", data) 对“150 万英镑”做同样的事情,但它替换为“1.5000000 英镑”。有什么建议吗?
gsub("([0-9]+).([0-9]) mil", "\\1\\200000", data),但这仅涵盖数以百万计的精确到一位小数。如果您有更多可能的情况,您必须确定要使用的正确模式,也许先解析数字,乘以后缀,然后替换。
\\1000 在这里是什么意思?该代码有效,但我不明白如何
\\1 是第一个子匹配项(即[0-9]+,因此是k 之前的数字)。 \\1000 然后表示获取该数字并将000 附加到它们,将5k 更改为5000。
您可以使用以下解决方案来处理K、M 和G(如果需要更多,只需调整ToDigits 函数即可):
> library(gsubfn)
> x <- "0.56K 50K 1.5M 56.56G"
> ToDigits <- function(s) {ifelse(s=="K", 1000, ifelse(s=="M", 1000000, 1000000000)) }
> gsubfn("(\\d*\\.?\\d+)([KMG])", function(y,z) as.numeric(y) * ToDigits(z), x)
[1] "560 50000 1500000 5.656e+10"
这里,(\\d*\\.?\\d+)([KMG]) 将 0+ 位、. 和 1+ 位捕获到第 1 组,然后将 K 或 M 或 G 捕获到第 2 组,gsubfn 用于操作找到的以这样一种方式匹配,即找到的数字与使用简单帮助器 ToDigits 函数获得的正确值相乘(如果 K 在第 2 组中,则与 1000 相乘等)
为了不区分大小写,您可以将上面的代码调整为
> ToDigits <- function(s) {ifelse(tolower(s)=="k", 1000, ifelse(tolower(s)=="m", 1000000, 1000000000)) }
> gsubfn("(\\d*\\.?\\d+)([KMGkmg])", function(y,z) as.numeric(y) * ToDigits(z), x)
[1] "560 50000 1500000 5.656e+10"
【讨论】: