Удалить последние цифры из чисел, которые превышают определенную длину

У меня есть вектор почтовых индексов, который включает в себя как пятизначные, так и девятизначные коды. Я хочу удалить конечные цифры из кодов, длина которых превышает пять.

Например, следующие коды:

zip<-c(11566, 46235, 50467, 856073217, 97333, 856159229)

должен стать

zip
11566
46235
50467
85607
97333
85615

Я думал, что gsub будет хорошим способом исправить это, но я не могу понять, как написать для него код. Я пробовал это, но это определенно не работает.

df$zip<- gsub("\\d(!i:5)", "", as.character(df$zip))

person Valerie    schedule 13.07.2016    source источник
comment
Вы конвертируете в символ для ввода, что хорошо - я не знаю, к какому классу относятся ваши реальные данные, но остерегайтесь использования numeric или integer для данных почтового индекса - многие почтовые индексы начинаются с 0, который будет удален, если вы конвертируете в числовой тип данных.   -  person Gregor Thomas    schedule 14.07.2016


Ответы (2)


Это должно работать

zip<-c(11566, 46235, 50467, 856073217, 97333, 856159229)

> s <- substr(zip,1,5)
> s
[1] "11566" "46235" "50467" "85607" "97333" "85615"

> as.numeric(s)
[1] 11566 46235 50467 85607 97333 85615
> 
person Ramesh K    schedule 13.07.2016
comment
Да, регулярное выражение является излишним для этой задачи. - person thelatemail; 14.07.2016
comment
Я бы пропустил as.numeric() -- не в этом образце данных, но некоторые почтовые индексы включают ведущие 0. - person Gregor Thomas; 14.07.2016

Мы можем использовать sub. Захватите первые пять персонажей как группу ((.{5})), а затем остальные символы. В замене заменяем на обратную ссылку.

as.numeric(sub("(.{5}).*", "\\1", zip))
#[1] 11566 46235 50467 85607 97333 85615

Просто для ясности: метод substr будет быстрее, чем sub. Но, поскольку пост был об использовании gsub/sub, это было бы полезно.

person akrun    schedule 14.07.2016