これは、複雑さのために複雑に見えるこれらのタイラーの質問のさらに別のものです:)
だからここに行く:
R> x <- c("20(0.23)", "15(0.2)", "16(0.09)")
R> sapply(strsplit(gsub("^(\\d+)\\((.*)\\)$", "\\1 \\2", x), " "),
+ function(x) sprintf("%2d(.%02d)",
+ as.numeric(x[1]),
+ as.numeric(x[2])*100))
[1] "20(.23)" "15(.20)" "16(.09)"
R>
ここでいくつかのことを行います。
- は、2 つの 2 つの
gsub()
数字を取り出します。最初に括弧の前の数字、次に括弧の内側の数字です。[後から考えると、小数点以下を選択する必要がありました。以下を参照してください。]
"20 0.23"
これにより、最初の例など、空白だけで出力されます。
- 次に、これに関する標準を使用し
strsplit()
ます。
- 次に、
sapply
取得したリストを処理するために使用しますstrsplit
- 最初の数値を 2 桁の int として出力します。
- 2 番目のものはよりトリッキーです --
(s)printf()
ファミリは先行ゼロを抑制することができないため、10 進数を出力し、整数の 2 桁を出力します -- それに応じて 2 番目の数値を変換します。
すべて簡潔で 1 行ですが、分割するとより明確になります。
編集:最速のソリューションを提供することはあまりありませんが、提供する場合、少なくともうめき声を上げることができます:
R> dason <- function(x) { numformat <- function(val){sub("^(-?)0.", "\\1.", sprintf("%.2f", as.numeric(val)))}; gsubfn("0\\.\\d+", numformat, x) }
R> dirk <- function(x) { sapply(strsplit(gsub("^(\\d+)\\((.*)\\)$", "\\1 \\2", x), " "), function(x) sprintf("%2d(.%02d)", as.numeric(x[1]), as.numeric(x[2])*100)) }
R>
R> dason(x)
[1] "20(.23)" "15(.20)" "16(.09)"
R> dirk(x)
[1] "20(.23)" "15(.20)" "16(.09)"
R>
R> res <- benchmark(dason(x), dirk(x), replications=1000, order="relative")
R> res
test replications elapsed relative user.self sys.self user.child sys.child
2 dirk(x) 1000 0.133 1.000 0.132 0.000 0 0
1 dason(x) 1000 2.026 15.233 1.960 0.064 0 0
R>
つまり、約 15 リム速くなります。この文脈では重要ではありませんが、スピードは長期的には誰にも害を及ぼすことはありません.