Распределение строки символов в несколько столбцов с сопоставлением с шаблоном strsplit - PullRequest
2 голосов
/ 24 сентября 2019

Это мой первый фрагмент текста из PDF-документа.Я представляю, как мне кажется, самый полезный формат для данных о том, что я делаю, но я могу ошибаться.Очистив текст PDF, я отформатировал его в tibble (ниже).

Я попытался использовать strsplit(dmt, \\s+), чтобы разбить строку символов на три отдельных столбца, но это просто полностью разделило все.Я использовал str_squish(), чтобы убрать пробелы в средней части текста, но это не помогло сопоставлению с образцом.

Первая числовая часть строки символов иногда заканчивается на ) или number.Вот то, с чем я работаю:

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

Ответы [ 2 ]

1 голос
/ 24 сентября 2019

Я предполагаю, что ваши данные в основном соответствуют представленным, с несколькими пробелами между столбцами.Другими словами, убедитесь, что ваш 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

Создано в 2019-09-23 пакетом представительство (v0.3.0)

0 голосов
/ 24 сентября 2019

На основе ваших данных мы также можем использовать tidyr::extract, определяя различные группы захвата.

library(dplyr)
library(tidyr)

df %>%
   extract(datamatrixtest, into = c("statute", "offense", "cases"),
           regex = "(.*?)\\s(.*?)(\\d.*)") %>%
    mutate_all(trimws)


#   statute       offense                                 cases 
#   <chr>         <chr>                                   <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 1341.15(2)    Improperly Attached License Plates      7  

Здесь мы определяем три группы, первые начинаются с начала текста до первого пробела, с которым встречаютсявторая начинается с того места, где заканчивается первая, пока не встретится число, а третья берет все от числа до конца предложения.

data

df <- structure(list(datamatrixtest = c("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"
)), row.names = c(NA, -10L), class = c("tbl_df", "tbl", "data.frame"))
...