У меня есть данные почтового индекса в R, которые выглядят так:
Postcodes
AB4 6JK
AR14 8UI
D4 9IK
CB3 9EU
Но я хочу разбить почтовые индексы на секторы почтовых индексов, которые включают все, что находится на один символ после пробела, чтобы они выглядели так:
Postcodes
AB4 6
AR14 8
D4 9
CB3 9
Я нашел множество вопросов и ответов, в которых основное внимание уделяется разделению строк на основе пробелов, например здесь и здесь, но как указать, что после пробела нужно разделить один символ?
Почтовые индексы не имеют фиксированной длины.
Я намерен впоследствии агрегировать данные почтового индекса на основе сектора почтового индекса более высокого уровня.
3 ответа
Вы можете попробовать следующий подход с использованием регулярных выражений, используя sub
. Он создает группу захвата и извлекает ее из строки.
Предполагая, что ваши данные называются x
:
x <- read.table(header=TRUE,text="Postcodes
'AB4 6JK'
'AR14 8UI'
'D4 9IK'
'CB3 9EU'")
Подход может быть таким:
sub("^(.*\\s.).*", "\\1", x$Postcodes)
# [1] "AB4 6" "AR14 8" "D4 9" "CB3 9"
Шаблон таков: начало строки (^
), за которым следуют любые символы (.*
), за которым следует пробел (\\s
) и один дополнительный символ (.
) - вместе они составляют группу захвата. Кроме того, все, что следует далее, не входит в группу захвата.
Обратите внимание, что если у вас есть строки с несколькими пробелами, он будет делать следующее:
sub("^(.*\\s.).*", "\\1", "abc def 981")
#[1] "abc def 9"
Вы можете использовать регулярное выражение положительного просмотра назад для разделения после числа, которому предшествует пробел.
strsplit(postcode,"(?<= [0-9])",perl=TRUE)
Чтобы получить первую часть разделенной строки:
sapply(strsplit(postcode,"(?<= [0-9])",perl=TRUE),'[[',1)
#[1] "AB4 6" "AR14 8" "D4 9" "CB3 9"
Вы также можете:
lapply(strsplit(as.character(Postcodes), " "), function(x) paste(x[1], substr(x[2],0,1)))
Похожие вопросы
Связанные вопросы
Новые вопросы
r
R — это бесплатный язык программирования с открытым исходным кодом и программная среда для статистических вычислений, биоинформатики, визуализации и общих вычислений. Пожалуйста, используйте минимально воспроизводимые примеры, которые другие могут запустить с помощью копирования и вставки. Показать желаемый результат полностью. Используйте dput() для данных и укажите все небазовые пакеты с помощью library(). Не вставляйте изображения для данных или кода, вместо этого используйте блоки кода с отступом. Для вопросов по статистике используйте https://stats.stackexchange.com.