r - 对用正则表达式提取的数字应用简单的数学函数
问题描述
我想知道如何对字符串中的数字执行基本的数学运算?例如,假设我有一个这样的数据框:
structure(list(Commission20 = c("$3255 1ST $100000 AND 1.2% BALANCE",
"$3255 1ST $100000 AND 1.2% BALANCE", "$1", "1ST $100000 2.5% AND BALANCE 1.2%",
"3.3% AND 1.0%ST $100 - 1.2% BALANCE", "3 % 1ST $100000 AND 1.0% SALE BALANCE"
)), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame"
))
# A tibble: 6 x 1
Commission20
<chr>
1 $3255 1ST $100000 AND 1.2% BALANCE
2 $3255 1ST $100000 AND 1.2% BALANCE
3 $1
4 1ST $100000 2.5% AND BALANCE 1.2%
5 3.3% AND 1.0%ST $100 - 1.2% BALANCE
6 3 % 1ST $100000 AND 1.0% SALE BALANCE
a.b% 1ST $abcdef AND m.n% BALANCE
佣金的标准形式是a.b%
3.3%之$abcdef
类的数字、100000 美元之m.n%
类的数字和 1.2% 之类的数字。从这个数据框中可以看出,$3255 1ST $100000 AND 1.2% BALANCE
它不是标准形式。所以我的目标是仅将佣金形式更改$klmn 1ST $abcdef AND m.n% BALANCE
为标准形式。我应该这样做的方式是划分klmn/abcdef
。所以例如一个像这样的字符串:
$3255 1ST $100000 AND 1.2% BALANCE
应替换3.2% 1ST $100000 AND 1.2% BALANCE
为从 3255/100000 计算的 3.2%。
我怎样才能做到这一点?我不确定是什么功能让我不仅可以选择这两个数字,还可以将它们分开。所以上面的数据框应该改成:
1 3.2% 1ST $100000 AND 1.2% BALANCE
2 3.2% 1ST $100000 AND 1.2% BALANCE
3 $1
4 1ST $100000 2.5% AND BALANCE 1.2%
5 3.3% AND 1.0%ST $100 - 1.2% BALANCE
6 3 % 1ST $100000 AND 1.0% SALE BALANCE
更改仅适用于第 1 行和第 2 行,因为只有第 1 行和第 2 行匹配$klmn 1ST $abcdef AND m.n% BALANCE
模式,因此应将它们更改为a.b% 1ST $abcdef AND m.n% BALANCE
模式
解决方案
您可以使用stringr
'sstr_replace_all
接受要应用于匹配模式的函数。
stringr::str_replace_all(df$Commission20, '\\$\\d+ 1ST \\$\\d+', function(m) {
m1 <- as.numeric(sub('\\$(\\d+).*', '\\1', m))
m2 <- as.numeric(sub('.*\\$(\\d+)$', '\\1', m))
sub('\\$\\w+', paste0(m1/m2 * 100, '%'), m)
})
#[1] "3.255% 1ST $100000 AND 1.2% BALANCE" "3.255% 1ST $100000 AND 1.2% BALANCE"
#[3] "$1" "1ST $100000 2.5% AND BALANCE 1.2%"
#[5] "3.3% AND 1.0%ST $100 - 1.2% BALANCE" "3 % 1ST $100000 AND 1.0% SALE BALANCE"
\\$\\d+ 1ST \\$\\d+
用于标识我们想要应用函数的行。
m1
是提取模式中的第一个数字 ( 3255
)
m2
是提取模式中的最后一个数字 ( 100000
)
我们使用sub
在执行计算后仅替换字符串中的第一个单词。
推荐阅读
- c++ - 在 pytorch c++ API 中添加填充
- javascript - 当有多个选项卡或窗口时,如何使用 navigator.serviceWorker.onmessage 在本地存储中存储一次数据?
- python - 为什么结果总是在 2.87 左右
- ios - 您如何解决“SDK 版本问题”?
- python - 无法循环通过设备
- angular - 刷新页面时显示找不到页面
- sqoop - Cloudera Sqoop 异常,当它通过 scoop 命令创建作业时
- powerbi - PowerBI 可以用来从多个 SAP-BW 多维数据集生成报告吗?
- kubernetes - 我是否需要在客户端使用 istio sidecar 代理才能应用路由规则?
- java - EmbeddedActiveMQBroker 的依赖关系是什么?