2015-12-01 8 views
8

標準化しようとしている一連の列名があります。文字列内に先行ゼロを追加する

names <- c("apple", "banana", "orange", "apple1", "apple2", "apple10", "apple11", "banana2", "banana12") 
私は stringr

strdouble <- str_detect(names, "[0-9]{2}") 
strsingle <- str_detect(names, "[0-9]") 

str_detect(names[strsingle & !strdouble]) 

が、できないのを使用しようとしてきたので、ゼロでパディングされる1桁の数字を持っているもの、

apple 
banana 
orange 
apple01 
apple02 
apple10 
apple11 
banana02 
... 

をしたいと思います

選択的に置き換える/プレインストールする方法を見つけ出す...

+3

サブ( "(a-z))([0-9])$"、 "\\ 10 \\ 2"、名前)は役に立ちますか? – etienne

+0

@etienneはい!あなたは交換のための "\\ 10 \\ 2"建設について説明できますか? – ano

+0

私は説明付きで答えを加えました。 – etienne

答えて

8

あなたはsub("([a-z])([0-9])$","\\10\\2",names)を使用することができます。

[1] "apple" "banana" "orange" "apple01" "apple02" "apple10" "apple11" "banana02" 
[9] "banana12" 

はそれだけで文字($は、文字列の末尾である)以下一桁がある名前を変更します。

\\1は、()の最初のブロック:文字を選択します。次に、先頭に0を、次に2番目のブロックに()を入れます。 stringrから

6

ここでは、ルックアヘッドとルックアヘッドアサーションを使用して1桁の数字を識別します。

gsub('(?<!\\d)(\\d)(?!\\d)', '0\\1', names, perl=TRUE) 
# [1] "apple" "banana" "orange" "apple01" "apple02" "apple10" "apple11" "banana02" "banana12" 
1

str_padは:

library(stringr) 

pad_if = function(x, cond, n, fill = "0") str_pad(x, n*cond, pad = fill) 

s = str_split_fixed(names,"(?=\\d)",2) 
#  [,1]  [,2] 
# [1,] "apple" "" 
# [2,] "banana" "" 
# [3,] "orange" "" 
# [4,] "apple" "1" 
# [5,] "apple" "2" 
# [6,] "apple" "10" 
# [7,] "apple" "11" 
# [8,] "banana" "2" 
# [9,] "banana" "12" 

paste0(s[,1], pad_if(s[,2], cond = nchar(s[,2]) > 0, n = max(nchar(s[,2])))) 
# [1] "apple" "banana" "orange" "apple01" "apple02" "apple10" "apple11" "banana02" "banana12" 

また、これはc("a","a2","a20","a202")から他のアプローチをカバーしていないc("a","a002","a020","a202")に行くようなケースにも及びます。

stringrパッケージはstringiに基づいています。これは、ここで使用されているのと同じ機能を持ちますが、私は推測しています。同様のアプローチにベースから


のsprintf、:それはx数値に強制可能である必要があるため

pad_if2 = function(x, cond, n, fill = "0") 
    replace(x, cond, sprintf(paste0("%",fill,n,"d"), as.numeric(x)[cond])) 

s0 = strsplit(names,"(?<=\\D)(?=\\d)|$",perl=TRUE) 

s1 = sapply(s0,`[`,1) 
s2 = sapply(sapply(s0,`[`,-1), paste0, "") 

paste0(s1, pad_if2(s2, cond = nchar(s2) > 0, n = max(nchar(s2)))) 

pad_if2は、pad_if未満一般的な用途を有します。ここのステップは、上記のパッケージに対応するコードよりも奇抜です。

+0

downvoteが説明できなくなったら、私は先に進み、これを削除します... – Frank

0

キーは、$と数字の前の文字で1桁を識別することです。試してみることができます:

gsub('[^0-9]([0-9])$','0\\1',names) 
[1] "apple" "banana" "orange" "appl01" "appl02" "apple10" "apple11" "banan02" "banana12" 

または先読み。

gsub('(?<=[a-z])(\\d)$','0\\1',names,perl=T) 
+0

Matthewと同じですが、 '(?!\\ d)'の代わりに '$'を使用していますか?うーん、私はマシューとエティエンヌのコンボのように思える... – Frank

関連する問題