web-dev-qa-db-ja.com

Rの英数字から先行ゼロを削除する

英数字の文字ベクトルdがあります

d <- c("012309 template", "separate 00340", "00045", "890 098", "3405 garage", "matter00908")

d
[1] "012309 template" "separate 00340"  "00045"           "890 098"         "3405 garage"     "matter00908"  

Rのすべての数値から先行ゼロを削除するにはどうすればよいですか? as.numericは、数値または整数ベクトルの先行ゼロをすべて削除します。 gsubregexで試しましたが、目的の結果が得られませんでした。

期待される出力は次のとおりです

out <- c("12309 template", "seperate 340", "45", "890 98", "3405 garage", "matter908")
out
[1] "12309 template" "seperate 340"   "45"             "890 98"         "3405 garage"    "matter908"  
12
Crops

数字が前に付いていない限り、負のルックビハインドを使用して0を削除できます。

> d <- c("100001", "012309 template", "separate 00340", "00045", "890 098", "3405 garage", "matter00908")
> gsub("(?<![0-9])0+", "", d, Perl = TRUE)
[1] "100001"         "12309 template" "separate 340"   "45"            
[5] "890 98"         "3405 garage"    "matter908"     

正規表現を使用する別の方法:

> gsub("(^|[^0-9])0+", "\\1", d, Perl = TRUE)
[1] "100001"         "12309 template" "separate 340"   "45"            
[5] "890 98"         "3405 garage"    "matter908"     
>
22
devnull

stringi パッケージのstri_replace_all_regexを利用したソリューションは次のとおりです。

d <- c("012309 template", "separate 00340", "00045",
       "890 098", "3405 garage", "matter00908")
library("stringi")
stri_replace_all_regex(d, "\\b0*(\\d+)\\b", "$1")
## [1] "12309 template" "separate 340"   "45"             "890 98"
## [5] "3405 garage"    "matter00908"   

説明:Wordの境界(\b)内のすべての数字シーケンスを照合しています。後続のゼロは貪欲に一致します(0+)。残りの数字(\dは任意の数字を示し、\d+はそれらの空でないシーケンスを示します)はグループ((...))内にキャプチャされます。次に、そのようなすべての一致をグループでキャプチャされたもののみに置き換えます。

(例のように)単語内の0も削除したい場合は、\bを省略して次のように呼び出します。

stri_replace_all_regex(d, "0*(\\d+)", "$1")
## [1] "12309 template" "separate 340"   "45"             "890 98"
## [5] "3405 garage"    "matter908"  
10
gagolews