【问题标题】:dplyr separate with regexdplyr 用正则表达式分开
【发布时间】:2020-02-14 21:45:39
【问题描述】:

我有以下数据框。它有 1 列文本,我想使用 dplyr 中的单独函数将其分成多列。

df <- structure(list(CPT.Codes = structure(c(2L, 1L, 3L, 4L, 5L), .Label = c("28296 - CORRECTION OF BUNION...., 64445P - N BLOCK INJ, SCIATIC, SNG, 76942P - US GUIDE, NEEDLE PLACEMENT", 
"36821 - AV FUSION DIRECT ANY SITE, 99100P - ANESTHESIA FOR PT OF EXTREME AGE", 
"41899 - DENTAL SURGERY PROCEDURE", "50593 - PERC CRYO ABLATE RENAL TUM, 99100P - ANESTHESIA FOR PT OF EXTREME AGE", 
"64721 - CARPAL TUNNEL SURGERY"), class = "factor")), class = "data.frame", row.names = c(NA, 
-5L))

我想要的输出是下面的数据框。每个 5 位数字或 5 位数字 + 字母代表代码,破折号后面的文本是代码的描述。有时代码的描述有一位数字和多个逗号,所以正则表达式需要将5位数字识别为新代码。

dfDesired <- structure(list(CPTcode1 = c(36821L, 28296L, 41899L, 50593L, 64721L
), CPTdescrip1 = structure(c(1L, 3L, 4L, 5L, 2L), .Label = c("AV FUSION DIRECT ANY SITE", 
"CARPAL TUNNEL SURGERY", "CORRECTION OF BUNION....", "DENTAL SURGERY PROCEDURE", 
"PERC CRYO ABLATE RENAL TUM"), class = "factor"), CPTcode2 = structure(c(2L, 
1L, NA, 2L, NA), .Label = c("64445P", "99100P"), class = "factor"), 
    CPTdescrip2 = structure(c(1L, 2L, NA, 1L, NA), .Label = c("ANESTHESIA FOR PT OF EXTREME AGE", 
    "N BLOCK INJ"), class = "factor"), CPTcode3 = structure(c(NA, 
    1L, NA, NA, NA), .Label = "76942P", class = "factor"), CPTdescrip3 = structure(c(NA, 
    1L, NA, NA, NA), .Label = "US GUIDE NEEDLE PLACEMENT", class = "factor")), class = "data.frame", row.names = c(NA, 
-5L))

我尝试了以下代码的变体。这是错误的。我是正则表达式的新手,无法通过现有示例解决此问题。

 CPT %>%
  separate(CPT.Codes, 
           into = c("CPTcode1", "CPTdescrip1", "CTPcode2", "CPTdescrip2", "CPTcode3", "CPTdescrip3"),
           sep = "(?<=[A-Z]) ?(?=[0-9])", remove = F) %>% 
  glimpse

提前致谢。

【问题讨论】:

  • 试试sep = ",(?=\\s*\\d{5})\\s*|\\s+-\\s+"

标签: r regex dplyr


【解决方案1】:

你可以分手

sep = ",(?=\\s*\\d{5})\\s*|\\s+-\\s+"

请参阅regex demo

详情

  • ,(?=\s*\d{5})\s* - 一个逗号 ,,后跟 0+ 个空格,然后是任意五位数字,然后是 0+ 个空格
  • | - 或
  • \s+-\s+ - 一个 - 字符,包含 1 个以上的空白字符。

【讨论】:

    【解决方案2】:

    没有那么普遍(如果您有超过 3 种可能的模式,则无法使用),但可能更具可读性,您可以使用 unglue_unnest()

    library(magrittr)
    library(unglue)
    
    patterns <- c(
      "{CPTcode1} - {CPTdescrip1}, {CPTcode2=[^ ]+} - {CPTdescrip2}, {CPTcode3=[^ ]+} - {CPTdescrip3}",
      "{CPTcode1} - {CPTdescrip1}, {CPTcode2=[^ ]+} - {CPTdescrip2}",
      "{CPTcode1} - {CPTdescrip1}")
    
    unglue_unnest(df, CPT.Codes, patterns)
    #>   CPTcode1                CPTdescrip1 CPTcode2                      CPTdescrip2 CPTcode3                CPTdescrip3
    #> 1    36821  AV FUSION DIRECT ANY SITE   99100P ANESTHESIA FOR PT OF EXTREME AGE     <NA>                       <NA>
    #> 2    28296   CORRECTION OF BUNION....   64445P        N BLOCK INJ, SCIATIC, SNG   76942P US GUIDE, NEEDLE PLACEMENT
    #> 3    41899   DENTAL SURGERY PROCEDURE     <NA>                             <NA>     <NA>                       <NA>
    #> 4    50593 PERC CRYO ABLATE RENAL TUM   99100P ANESTHESIA FOR PT OF EXTREME AGE     <NA>                       <NA>
    #> 5    64721      CARPAL TUNNEL SURGERY     <NA>                             <NA>     <NA>                       <NA>
    

    【讨论】:

      猜你喜欢
      • 2015-05-05
      • 2022-12-06
      • 2015-09-25
      • 2021-11-02
      • 1970-01-01
      • 2023-04-02
      • 2020-03-06
      • 2018-02-15
      • 2015-08-12
      相关资源
      最近更新 更多