r - 在文本中的单个数字整数后添加小数分隔符和两个零
问题描述
我有两个变量,如下所示:
x <- "3%-1ST $100000 AND 1.25% BALANCE"
y <- "3.22%-1ST $100000 AND 1.25% BALANCE"
我想要做的是添加并将.00
其3%
更改为3.00%
使用正则表达式;但是,3.22
应该是完整的,不需要更改它(我的主数据集有 50000 行,这两个只是一个例子)我首先尝试了下面的代码:
gsub("\\b(\\d)%\\b", "\\1\\.00%", x)
结果如下所示:
[1] "3%-1ST $100000 AND 1.25% BALANCE"
[2] "3.22%-1ST $100000 AND 1.25% BALANCE"
如您所见,我没有成功进行更改。我尝试了另一个没有\\b
. 结果如下所示:
[1] "3.00%-1ST $100000 AND 1.25.00% BALANCE"
[2] "3.22.00%-1ST $100000 AND 1.25.00% BALANCE"
这个结果也是不可接受的,因为它改变了 3.22。我想\\b
必须定义字符串的边界;但是,由于某种我不确定的原因,它不起作用。您能否澄清一下我如何完成这项任务以及使用有什么问题\\b
?
解决方案
数据:
x <- c("3%-1ST $100000 AND 1.25% BALANCE",
"3.22%-1ST $100000 AND 1.25% BALANCE",
"12.15% AND 5%")
解决方案:
gsub("(?<!\\d\\.\\d)(\\d)(%)", "\\1.00\\2", x, perl = T)
[1] "3.00%-1ST $100000 AND 1.25% BALANCE" "3.22%-1ST $100000 AND 1.25% BALANCE" "12.15% AND 5.00%"
解决方案不在于使用单词边界,而是定义一个不发生替换的否定条件。该否定条件是使用否定的lookbehind 实现的(?<!...)
。
更详细的回顾:
(?<!
:这会初始化否定的lookbehind,这是一个匹配的指令,如果在左边你看不到......\\d
: 一个数字\\.
: 一段时间\\d
: 一个数字
)
:这个括号结束了负面的回顾
推荐阅读
- python - Pandas 合并通过索引合并和列合并给出不同的答案
- python - PySpark 2.4.4 toPandas 失败,ValueError 没有足够的值来解包(预期 3,得到 2)
- css - 如何使用 react-native 根据不同语言动态更改字体系列
- javascript - 如何向我们服务器上具有特定角色的所有成员发送消息?
- mysql - 每天选择和统计数据
- unit-testing - 如何编写应该失败的单元测试?
- java - 使用java检索唯一的永久机器(笔记本电脑/计算机)ID
- python-3.x - 矩阵加法给出错误答案
- c++ - 可以将任意大小的 constexpr 数组用作 switch 语句中的 case 吗?
- azure - 错误:order by query 没有相应的复合索引可以从中提供服务