2016-07-13 2 views
3

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

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

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)) 
+0

Вы конвертируете в символ для ввода, который хорош - я не знаю, в каком классе находятся ваши настоящие данные, но остерегайтесь использования 'numeric' или' integer' для данных почтового индекса - многие почтовые индексы начинаются с '0' который будет удален, если вы конвертируете в числовой тип данных. – Gregor

ответ

9

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

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 
> 
+3

Yep, regex overkill для этой задачи. – thelatemail

+1

Я бы пропустил 'as.numeric()' - не в этом примере данных, но некоторые почтовые индексы включают в себя ведущие 0s. – Gregor

+0

@ Грегор, это правильно. – Koba

1

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

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

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

Смежные вопросы