У меня есть данные почтового индекса в R, которые выглядят так:

Postcodes
AB4 6JK
AR14 8UI
D4 9IK
CB3 9EU

Но я хочу разбить почтовые индексы на секторы почтовых индексов, которые включают все, что находится на один символ после пробела, чтобы они выглядели так:

Postcodes
AB4 6
AR14 8
D4 9
CB3 9

Я нашел множество вопросов и ответов, в которых основное внимание уделяется разделению строк на основе пробелов, например здесь и здесь, но как указать, что после пробела нужно разделить один символ?

Почтовые индексы не имеют фиксированной длины.

Я намерен впоследствии агрегировать данные почтового индекса на основе сектора почтового индекса более высокого уровня.

1
Thirst for Knowledge 7 Сен 2016 в 13:37

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"
4
talat 7 Сен 2016 в 10:45

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

strsplit(postcode,"(?<= [0-9])",perl=TRUE)

Чтобы получить первую часть разделенной строки:

sapply(strsplit(postcode,"(?<= [0-9])",perl=TRUE),'[[',1)
#[1] "AB4 6"  "AR14 8" "D4 9"   "CB3 9"
1
NicE 7 Сен 2016 в 10:46

Вы также можете:

lapply(strsplit(as.character(Postcodes), " "), function(x) paste(x[1], substr(x[2],0,1)))
1
989 7 Сен 2016 в 11:24