Разбор строки с несколькими скобками - PullRequest
2 голосов
/ 23 марта 2020

У меня есть набор данных dt со столбцом "subject ", который мне нужно проанализировать. Например,

ID    subject   

1     USA(Texas)(Austin)
2     USA(California)(Sacramento)

В результате я хочу получить следующую таблицу:

ID    subject                       Country     State        Capital   

1     USA(Texas)(Austin)            USA         Texas        Austin
2     USA(California)(Sacramento)   USA         California   Sacramento

Как я могу это сделать?

1 Ответ

1 голос
/ 23 марта 2020

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

library(dplyr)
library(tidyr)

extract(dt, subject, into = c("Country", "State", "Capital"),
              regex = "(.*)\\((.*?)\\)\\((.*)\\)", remove = FALSE)

#  ID                     subject Country      State    Capital
#1  1          USA(Texas)(Austin)     USA      Texas     Austin
#2  2 USA(California)(Sacramento)     USA California Sacramento

Другой вариант с более простым регулярным выражением - убрать круглые скобки с gsub и использовать separate с аргументом sep в качестве пробела.

dt %>%
  mutate(subject = trimws(gsub('[()]', ' ', subject))) %>%
  separate(subject, into = c("Country", "State", "Capital"), sep = "\\s+")

данные

dt <- structure(list(ID = 1:2, subject = structure(2:1, 
.Label = c("USA(California)(Sacramento)", "USA(Texas)(Austin)"), 
class = "factor")), class = "data.frame", row.names = c(NA, -2L))
...