Как разбить текст на несколько столбцов? - PullRequest
0 голосов
/ 15 января 2020

У меня есть столбец с текстом в формате:

ID-XXXXX Process for Description [1/5]

Я хотел бы разбить его на три столбца, где:

A = ID-XXXXX

B = Process for Description

C = 1/5

Любые идеи о том, как разделить это правильно?

Ответы [ 2 ]

0 голосов
/ 08 февраля 2020

Используя stringr, есть несколько опций:

dat <- data.frame(my_string = "ID-XXXXX Process for Description [1/5]")

dat %>% 
  mutate(A = str_extract(string = my_string, pattern = "ID-.{5}"),
         B = str_replace(string = my_string, pattern = "ID-.{5}\\s(.+)\\s\\[.*\\]", replacement = "\\1"),
         C = str_match(string = my_string, pattern = "\\[(.*)\\]")[2])

A: извлечь следующий шаблон: ID-, за которым следуют ровно 5 символов
B: захват группы между ID-XXXXX и [X-X] и замените весь шаблон захваченным шаблоном
C: соответствует захваченному шаблону (.*) в квадратных скобках (2-й столбец str_match возвращает захваченный шаблон)

Результат:

                               my_string        A                       B   C
1 ID-XXXXX Process for Description [1/5] ID-XXXXX Process for Description 1/5

РЕДАКТИРОВАТЬ :
Я только что вспомнил, что функция extract() из tidyr делает именно это.
Использование групп захвата между круглыми скобками в regex аргумент, вы получаете их в новые столбцы напрямую.

dat <- data.frame(my_string = paste0("ID-0000", 1:5, " Process_", LETTERS[1:5], " [", 1:5, "/5]"))

extract(data = dat,
        col = my_string, 
        into = c("A", "B", "C"), 
        regex = "(ID-.{5})\\s(.+)\\s\\[(.*)\\]", 
        remove = FALSE)

                 my_string        A         B   C
1 ID-00001 Process_A [1/5] ID-00001 Process_A 1/5
2 ID-00002 Process_B [2/5] ID-00002 Process_B 2/5
3 ID-00003 Process_C [3/5] ID-00003 Process_C 3/5
4 ID-00004 Process_D [4/5] ID-00004 Process_D 4/5
5 ID-00005 Process_E [5/5] ID-00005 Process_E 5/5

Если вы не хотите сохранять исходную строку, используйте remove = TRUE.

0 голосов
/ 30 января 2020

вот попытка помочь вам. Помните, что первая часть немного хитрая, и я использовал регулярное выражение с идеей, что XXXXX всегда будет длиной 5 символов.

d = "ID-XXXXX Process for Description [1/5]"

a =sub('[  ].+',"",d)

c = sub('.+[  ][[]',"",d) ; c = sub('[]]',"",c)

b = sub('[  ][[].*[]]',"",d) ;b = gsub('ID-.{5}[ ]',"",b)

f = c(a,b,c) ; f
# [1] "ID-XXXXX" "Process for Description" "1/5" 
...