【问题标题】:Applying simple mathematical function on numbers extracted with regex对用正则表达式提取的数字应用简单的数学函数
【发布时间】:2020-11-21 00:19:57
【问题描述】:

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

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形式的only佣金改为标准形式。我应该这样做的方法是划分klmn/abcdef。所以例如一个像这样的字符串:

$3255 1ST $100000 AND 1.2% BALANCE 应替换为 3.2% 1ST $100000 AND 1.2% BALANCE,其中 3.2% 由 3255/100000 计算得出。

我该怎么做?我不确定什么功能让我不仅可以选择这两个数字,还可以将它们分开。所以上面的数据框应该改成:

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

【问题讨论】:

    标签: r regex


    【解决方案1】:

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

    【讨论】:

    • 谢谢,罗纳克沙阿。我只有一个问题。在str_replace_all 中使用函数让我感到困惑。你能详细说明它是如何工作的吗?该函数返回什么作为替换?另外,由于我更喜欢​​处理主数据框,有没有办法将输出作为数据框?我应该简单地使用as.dataframe吗?
    • '\\$\\d+ 1ST \\$\\d+' 是替换函数的输入,sub('\\$\\w+', paste0(m1/m2 * 100, '%'), m) 是输出。您可以将数据分配回列以维护数据框。 df$Commission20 &lt;- stringr::str_replace_all(df$Commission20, ....)
    猜你喜欢
    • 1970-01-01
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多