【问题标题】:How to grab some character after "-"?如何在“-”之后获取一些字符?
【发布时间】:2020-09-10 06:30:00
【问题描述】:

假设我的tbl中有一个“选项代码”列,数据是这样的:

m1803-C-2550
m1807-P-3050

我想在“-”作为我的新变量“期权类型”和第二个“-”之后的 2550/3050 作为我的新变量“执行价格”之间获取 C/P。

如何使用tidyverse 编码?

现在,我可以解决第一个问题

tbl %>% mutate(option_type = str_sub(option_code, str_locate(option_code, "[CP]"))

但是我无法解决我的第二个问题,或者你们可能有一个优雅的方式来解决我的第一个问题。

【问题讨论】:

    标签: r regex tidyverse stringr


    【解决方案1】:

    试试这个:

    library(dplyr)
    library(stringr)
    
      df %>% 
      mutate(option_type = str_extract(option_code, "(?<=-)[CP]"),
             strike_price = as.numeric(str_extract(option_code, "(?<=-)\\d+")))
    
    #>    option_code option_type strike_price
    #> 1 m1803-C-2550           C         2550
    #> 2 m1807-P-3050           P         3050
    

    数据

    df <- data.frame(option_code =  c("m1803-C-2550", "m1807-P-3050"))
    

    reprex package (v0.3.0) 于 2020 年 5 月 23 日创建

    【讨论】:

    • 字符类中不需要替代标记|;在那里,任何字符都可以以任何顺序和任何组合出现。
    【解决方案2】:

    您可以在tidyr 中使用separate() 通过分隔符来分割字符串。

    library(tidyr)
    
    df %>%
      separate(option_code, c(NA, "option_type", "strike_price"))
    
    #   option_type strike_price
    # 1           C         2550
    # 2           P         3050
    
    • NA 表示删除第一部分,即m1803
    • 如果您想保留option_code,则只需添加参数remove = F

    数据

    df <- data.frame(option_code = c("m1803-C-2550", "m1807-P-3050"))
    

    【讨论】:

      【解决方案3】:

      基础 R 解决方案:

      setNames(data.frame(lapply(strsplit(tmp, "-"),"[", -1)), c("option_type", "strike_price"))
      

      数据:

      tmp <- c("m1803-C-2550",
               "m1807-P-3050")
      

      【讨论】:

        【解决方案4】:

        你可以使用str_extractfrom stringr:

        df %>% mutate(option_type = str_extract(option_code, "[CP]"),
                      strike_price = str_extract(option_code, "(?<=[CP]-)\\d+"))
        
        # A tibble: 2 x 3
          option_code  option_type strike_price
          <chr>        <chr>       <chr>       
        1 m1803-C-2550 C           2550        
        2 m1807-P-3050 P           3050  
        

        数据:

        df <- tibble(option_code = c("m1803-C-2550","m1807-P-3050"))
        

        【讨论】:

        • 非常感谢。有时 option_code 会以 C 或 P 开头,所以我认为@Peter 的答案更好。
        • 如上所述,[CP]等字符类的语法允许包含在其中的字符以任意顺序和任意组合出现。所以[CP] 匹配:CPCPPC
        • 我的意思是第一个option_type,前几个code其实是商品编码,在这个例子中是“m”,但下次可能是P或者C。如果使用[CP],可能会有一些问题。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-09-18
        • 2017-12-23
        • 1970-01-01
        • 2020-12-29
        • 2016-08-15
        • 1970-01-01
        • 2013-05-21
        相关资源
        最近更新 更多