Разделение столбца на несколько столбцов по разделителю

У меня есть data.frame со столбцом "нарушение". Каждое правонарушение состоит из статьи (Art), абзаца (Abs) и подпункта (Ziff):

df<-data.frame(offence=c("Art. 110 Abs. 3 StGB","Art. 10 Abs. 1 StGB", "Art. 122 SVG", "Art. 1 Ziff. 2 UWG"))

> df
               offence
1 Art. 110 Abs. 3 StGB
2  Art. 10 Abs. 1 StGB
3         Art. 122 SVG
4   Art. 1 Ziff. 2 UWG

Но мне нужно, чтобы он был в таком виде:

  Art Ziff Abs  Law
1 110   NA   3 StGB
2  10   NA   1 StGB
3 122   NA  NA  SVG
4   1    2  NA  UWG

Как лучше всего получить такой результат? лафский?

Спасибо!


person D. Studer    schedule 05.10.2017    source источник


Ответы (2)


Вы можете использовать str_extract из stringr:

library(stringr)
library(dplyr)

df$offence %>%
  {data.frame(Art = str_extract(., "(?<=Art[.]\\s)\\d+"),
              Ziff = str_extract(., "(?<=Ziff[.]\\s)\\d+"),
              Abs = str_extract(., "(?<=Abs[.]\\s)\\d+"),
              Law = str_extract(., "\\w+$"))}

Результат:

  Art Ziff  Abs  Law
1 110 <NA>    3 StGB
2  10 <NA>    1 StGB
3 122 <NA> <NA>  SVG
4   1    2 <NA>  UWG
person acylam    schedule 05.10.2017

Преобразуйте его в форму dcf (то есть ключевое слово: значение), используя gsub, а затем прочтите его, используя read.dcf. В конце преобразуйте матрицу, которую создает read.dcf, в фрейм данных и преобразуйте любые числовые столбцы в числовые. Пакеты не используются.

s <- gsub("(\\S+)[.] (\\d+)", "\\1: \\2\n", df[[1]]) # convert to keyword: value
s <- sub(" (\\D+)$", "Law: \\1\n\n", s) # handle Law column
us <- trimws(unlist(strsplit(s, "\n")))  # split into separate components
DF <- as.data.frame(read.dcf(textConnection(us)), stringsAsFactors = FALSE)
DF[] <- lapply(DF, type.convert)

давая:

  Art Abs  Law Ziff
1 110   3 StGB   NA
2  10   1 StGB   NA
3 122  NA  SVG   NA
4   1  NA  UWG    2
person G. Grothendieck    schedule 05.10.2017