r - 使用 strsplit 模式匹配将字符串分散到多列中

标签 r regex strsplit tibble

这是我第一次从 PDF 文档抓取文本。我正在展示我认为对我正在做的事情最有用的数据格式,但我可能是错的。清理完 PDF 文本后,我将其格式化为 tibble(如下)。

我尝试利用 strsplit(dmt,\\s+) 将字符串拆分为三个单独的列,但这只是将所有内容完全分开。我使用 str_squish() 来消除字符串中间文本部分的空格,但这对模式匹配没有帮助。

字符串的第一个数字部分有时以 )数字 结尾。这是我正在处理的内容:

dmt
# A tibble: 612 x 1
   datamatrixtest[,1]                                             
   <chr>                                                          
 1 110.05          Human Service Vehicle Inspection Reqd         6
 2 23.33(12)(b)    ATV-Fail/Stop for Law Enforce. Official       1
 3 23.33(6)(a)     ATV-Fail/Display Lighted Headlamp             1
 4 341.03          Oper Veh After Sus/Rev or Can of Reg      8,862
 5 341.04(1)       Non-Registration of Vehicle              10,125
 6 341.04(2)       Improper Registration of Vehicle              4
 7 341.15(1)       Fail/Display Vehicle License Plates       2,010
 8 341.15(1m)(a)   Fail/Attach Rear Regis. Decal/Tag             3
 9 341.15(1m)(b)   Fail/Attach Front Regis. Decal/Tag            2
10 341.15(2)       Improperly Attached License Plates            7
# ... with 602 more rows

理想情况下,我可以利用 strsplit 进行精确的模式匹配,将数据放入三个单独的列中。

dmt
# A tibble: 612 x 3
   statute         offense                                    cases
   <chr>           <chr>                                       <num>        
 1 110.05          Human Service Vehicle Inspection Reqd         6
 2 23.33(12)(b)    ATV-Fail/Stop for Law Enforce. Official       1
 3 23.33(6)(a)     ATV-Fail/Display Lighted Headlamp             1
 4 341.03          Oper Veh After Sus/Rev or Can of Reg      8,862
 5 341.04(1)       Non-Registration of Vehicle              10,125
 6 341.04(2)       Improper Registration of Vehicle              4
 7 341.15(1)       Fail/Display Vehicle License Plates       2,010
 8 341.15(1m)(a)   Fail/Attach Rear Regis. Decal/Tag             3
 9 341.15(1m)(b)   Fail/Attach Front Regis. Decal/Tag            2
10 341.15(2)       Improperly Attached License Plates            7

最佳答案

我假设您的数据基本上如所呈现的那样,列之间有多个空格。换句话说,检查您的 dmt 是否与我在下面创建的那个相当。在这种情况下,我们可以像这样使用 \\s{2,} 将多个空格的任何部分上的每一行分开。如果您的数据不是这样,或者任何单个字段恰好包含多个空格,则使用 dput 和 head 提供示例,以便我们找到更精确的模式那会起作用的。

library(tidyverse)
dmt <- read_lines(
"110.05          Human Service Vehicle Inspection Reqd         6
23.33(12)(b)    ATV-Fail/Stop for Law Enforce. Official       1
23.33(6)(a)     ATV-Fail/Display Lighted Headlamp             1
341.03          Oper Veh After Sus/Rev or Can of Reg      8,862
341.04(1)       Non-Registration of Vehicle              10,125
341.04(2)       Improper Registration of Vehicle              4
341.15(1)       Fail/Display Vehicle License Plates       2,010
341.15(1m)(a)   Fail/Attach Rear Regis. Decal/Tag             3
341.15(1m)(b)   Fail/Attach Front Regis. Decal/Tag            2
1341.15(2)       Improperly Attached License Plates            7"
) %>%
  enframe(name = NULL, value = "line")

dmt %>%
  separate(line, c("statute", "offense", "cases"), sep = "\\s{2,}") %>%
  mutate(cases = cases %>% str_remove_all(",") %>% as.integer)
#> # A tibble: 10 x 3
#>    statute       offense                                 cases
#>    <chr>         <chr>                                   <int>
#>  1 110.05        Human Service Vehicle Inspection Reqd       6
#>  2 23.33(12)(b)  ATV-Fail/Stop for Law Enforce. Official     1
#>  3 23.33(6)(a)   ATV-Fail/Display Lighted Headlamp           1
#>  4 341.03        Oper Veh After Sus/Rev or Can of Reg     8862
#>  5 341.04(1)     Non-Registration of Vehicle             10125
#>  6 341.04(2)     Improper Registration of Vehicle            4
#>  7 341.15(1)     Fail/Display Vehicle License Plates      2010
#>  8 341.15(1m)(a) Fail/Attach Rear Regis. Decal/Tag           3
#>  9 341.15(1m)(b) Fail/Attach Front Regis. Decal/Tag          2
#> 10 1341.15(2)    Improperly Attached License Plates          7

reprex package于2019年9月23日创建(v0.3.0)

关于r - 使用 strsplit 模式匹配将字符串分散到多列中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58070787/

相关文章:

r - 将多个模型公式应用于数据组

r - 边界处估计的概率是什么意思?使用 depmixS4 包的 R 中的隐马尔可夫模型

PHP 正斜杠匹配

Java - 如何拆分基于列的字符串?

r - 根据值将逗号分隔的数字列拆分为多列

r - 分割字符串而不丢失字符 - R

r - 如何使用基数 r 将 dbeta 图中的 x 值转换为百分比?

r - 使用 R,如何按星期几汇总?

javascript - 为什么带有全局标志的 RegExp 会给出错误的结果?

r - 如何从R中的strsplit()获取空的最后一个元素?