首页 > 解决方案 > 对用正则表达式提取的数字应用简单的数学函数

问题描述

我想知道如何对字符串中的数字执行基本的数学运算?例如,假设我有一个这样的数据框:

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模式

标签: rregex

解决方案


您可以使用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在执行计算后仅替换字符串中的第一个单词。


推荐阅读