2016-07-13 3 views
3

私は、5桁と9桁の両方のコードを含む郵便番号のベクトルを持っています。私は5の長さを超えるコードから最後の数字を削除したいと思います。特定の長さを超える数字の最後の数字を削除します。

例えば

、以下のコード:

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

実際のデータがどのクラスにあるのか分かりませんが、郵便番号データには「数値」または「整数」を使用してください。多くの郵便番号は「0」から始まります。数値データ型に変換すると削除されます。 – Gregor

答えて

9

これは、我々はsubを使用することができます

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

はい、正規表現はこのタスクのために過剰です。 – thelatemail

+1

このサンプルデータではなく、 'as.numeric()'をスキップしますが、いくつかの郵便番号には先行0が含まれています。 – Gregor

+0

@Gregor、そうです。 – Koba

1

を動作するはずです。最初の5文字を​​グループ((.{5}))として残りの文字をキャプチャします。置き換えでは、逆参照と置き換えます。

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

だけ明確にすること、substr方法はsubよりも高速になります。しかし、投稿がgsub/subを使用していたので、これは役に立ちます。

関連する問題