#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"