【问题标题】:Looking for string with only one number and extract that number寻找只有一个数字的字符串并提取该数字
【发布时间】:2020-11-24 02:31:22
【问题描述】:

我有一个包含不同类型佣金的数据框。由于佣金没有特定的模式,因此很难提取数字;但是,作为起点,我想做以下事情:

  1. 查找包含一个数字的佣金
  2. 决定数字是 $abcde(例如:$1000 或 $12350) 还是 a.b%(例如:2.1%) 的形式
  3. 如果数字在 $abcde 中,则提取数字并将其添加到 Fixed 列,如果 a.b% 提取数字并保存在第二

数据框如下图:

structure(list(commission = c("SELLING COMMISSION IS $9000", 
"NO COMMISSION", "SELLING BROKER COMMISSION:$26729", "AND 3.1% 1ST $100000 AND 1.2% BALANCE AND GST", 
"3.5% - 1ST $100000", "3.3% AND 1.2% PLUS GST", "3.2% - 1.0%", 
"1.2% FULL PRICE", "1% SELLING PRICE"), First = c(NA_character_, 
NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, 
NA_character_, NA_character_, NA_character_), `cut-off` = c(NA_character_, 
NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, 
NA_character_, NA_character_, NA_character_), Second = c(NA_character_, 
NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, 
NA_character_, NA_character_, NA_character_), Bonus = c(NA_character_, 
NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, 
NA_character_, NA_character_, NA_character_), Fixed = c(NA_character_, 
NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, 
NA_character_, NA_character_, NA_character_)), class = "data.frame", row.names = c(NA, 
-9L))

所以预期的结果如下所示:

                                     commission First cut-off Second Bonus Fixed
1                   SELLING COMMISSION IS $9000  <NA>    <NA>   <NA>  <NA>  9000
2                                 NO COMMISSION  <NA>    <NA>   <NA>  <NA>  <NA>
3              SELLING BROKER COMMISSION:$26729  <NA>    <NA>   <NA>  <NA>  26729
4 AND 3.1% 1ST $100000 AND 1.2% BALANCE AND GST  <NA>    <NA>   <NA>  <NA>  <NA>
5                            3.5% - 1ST $100000  <NA>    <NA>   <NA>  <NA>  <NA>
6                        3.3% AND 1.2% PLUS GST  <NA>    <NA>   <NA>  <NA>  <NA>
7                                   3.2% - 1.0%  <NA>    <NA>   <NA>  <NA>  <NA>
8                               1.2% FULL PRICE  <NA>    <NA>   1.2   <NA>  <NA>
9                              1% SELLING PRICE  <NA>    <NA>   1     <NA>  <NA>

知道我该怎么做吗?

【问题讨论】:

    标签: r regex dataframe


    【解决方案1】:

    这是dplyr 解决方案

    library(dplyr)
    library(stringr)
    
    df %>% 
      mutate(
        cond = lengths(str_extract_all(commission, "\\$?\\d*\\.?\\d+%?")) < 2L, 
        Fixed = if_else(cond, str_extract(commission, "(?<=\\$)\\d*\\.?\\d+"), NA_character_), 
        Second = if_else(cond, str_extract(commission, "\\d*\\.?\\d+(?=%)"), NA_character_), 
        cond = NULL
      )
    

    输出

                                         commission First cut-off Second Bonus Fixed
    1                   SELLING COMMISSION IS $9000  <NA>    <NA>   <NA>  <NA>  9000
    2                                 NO COMMISSION  <NA>    <NA>   <NA>  <NA>  <NA>
    3              SELLING BROKER COMMISSION:$26729  <NA>    <NA>   <NA>  <NA> 26729
    4 AND 3.1% 1ST $100000 AND 1.2% BALANCE AND GST  <NA>    <NA>   <NA>  <NA>  <NA>
    5                            3.5% - 1ST $100000  <NA>    <NA>   <NA>  <NA>  <NA>
    6                        3.3% AND 1.2% PLUS GST  <NA>    <NA>   <NA>  <NA>  <NA>
    7                                   3.2% - 1.0%  <NA>    <NA>   <NA>  <NA>  <NA>
    8                               1.2% FULL PRICE  <NA>    <NA>    1.2  <NA>  <NA>
    9                              1% SELLING PRICE  <NA>    <NA>      1  <NA>  <NA>
    

    【讨论】:

    • 谢谢,你能解释一下代码是如何工作的吗?特别是cond 部分。 2L 在那里做什么?我猜你是在创造一个条件,然后根据条件做出决定;但是,我不清楚它是如何工作的
    • 2L 基本上是整数类型的 2。该行仅提取所有数字并测试每个匹配组是否少于 2 个元素。在 R 控制台中试试这个str_extract_all(df$commission, "\\$?\\d*\\.?\\d+%?") 和这个lengths(str_extract_all(commission, "\\$?\\d*\\.?\\d+%?")) &lt; 2L。 @Roozbeh_you
    猜你喜欢
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-30
    • 1970-01-01
    相关资源
    最近更新 更多