Как сохранить определенные части строки в R

#r #string #data-cleaning

#r #строка #очистка данных

Вопрос:

У меня есть набор данных с отдельными лицами и странами их рождения. Однако некоторые люди родились во времена, когда существовали Югославия, Австрийская империя, Пруссия и т. Д., Поэтому в значениях столбцов текущая страна указана в скобках. Как я могу сохранить только страну в скобках, чтобы позже я мог группировать свои данные по странам?

 Person          Birth Country
 Nick         Prussia (Germany)
 Mike             Germany
 Maria            Canada
 Mark          Russian Empire (Poland)         
 Sven             Germany
 Jarek            Poland   
  

Ответ №1:

Мы можем использовать sub для извлечения символов, которые не ) после a ( , в качестве группы захвата, а при замене указать обратную ссылку ( \1 ) захваченной группы

 df1$Country <- sub(".*\(([^)] )\).*", "\1", df1$`Birth Country`)
df1$Country
#[1] "Germany" "Germany" "Canada"  "Poland"  "Germany" "Poland" 
  

Сопоставляемый шаблон .* (любой символ), за которым следует литерал ( (escape \( — поскольку это метасимвол), затем записывает символы в виде группы ( (...) ), которые не являются ) ( [^)] ) , за которыми следует ) ( \) ) и любые другие символы ( .* )

данные

 df1 <- structure(list(Person = c("Nick", "Mike", "Maria", "Mark", "Sven", 
"Jarek"), `Birth Country` = c("Prussia (Germany)", "Germany", 
"Canada", "Russian Empire (Poland)", "Germany", "Poland")),
class = "data.frame", row.names = c(NA, 
-6L))
  

Комментарии:

1. Это работает, спасибо Akrun! Не могли бы вы дать небольшое объяснение, как это работает, пожалуйста?

2. @NickA спасибо, я добавил некоторое описание. Надеюсь, это сработает для вас.

Ответ №2:

Вы можете удалить все, вплоть до открывающих скобок и закрывающей скобки (если они существуют) :

 gsub('.*\(|\)', '', df$Birth_Country)
#[1] "Germany" "Germany" "Canada"  "Poland"  "Germany" "Poland"