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
未満一般的な用途を有します。ここのステップは、上記のパッケージに対応するコードよりも奇抜です。
サブ( "(a-z))([0-9])$"、 "\\ 10 \\ 2"、名前)は役に立ちますか? – etienne
@etienneはい!あなたは交換のための "\\ 10 \\ 2"建設について説明できますか? – ano
私は説明付きで答えを加えました。 – etienne