5

私はこのようなベクトルを持っています:

x <- c("20(0.23)", "15(0.2)", "16(0.09)")

かっこの外側の数字を台無しにしたくありませんが、内側の数字の先頭のゼロを削除して、すべてを2桁にしたいと考えています。出力は次のようになります。

"20(.23)", "15(.20)", "16(.09)"

有用な情報:

以下から取得した関数を使用して、先頭のゼロを削除し、2 桁を保持できます: LINK

numformat <- function(val) { sub("^(-?)0.", "\\1.", sprintf("%.2f", val)) }

numformat(c(0.2, 0.26))
#[1] ".20" ".26"

使えることはわかっgsubていますが、使い方がわかりません。答えを提供しstrsplitますが、それはせいぜいハックです。

4

4 に答える 4

7

gsubfn パッケージを使用すると、正規表現に一致するものを、一致に適用される関数に置き換えることができます。numformatしたがって、関数であなたが持っているものを使用できます

library(gsubfn)
# Note that I added as.numeric in because what will be passed in
# is a character string
numformat <- function(val){sub("^(-?)0.", "\\1.", sprintf("%.2f", as.numeric(val)))}
gsubfn("0\\.\\d+", numformat, x)
#[1] "20(.23)" "15(.20)" "16(.09)"
于 2012-10-13T21:15:15.893 に答える
3
pad.fix<-function(x){
y<-gsub('\\.(\\d)\\)','\\.\\10\\)',x)
gsub('0\\.','\\.',y)
}

最初のgsubは、必要に応じて末尾のゼロを追加し、2番目のgsubは先行ゼロを削除します。

于 2012-10-14T03:53:29.690 に答える
2

これは、複雑さのために複雑に見えるこれらのタイラーの質問のさらに別のものです:)

だからここに行く:

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> 

ここでいくつかのことを行います。

  1. は、2 つの 2 つのgsub()数字を取り出します。最初に括弧の前の数字、次に括弧の内側の数字です。[後から考えると、小数点以下を選択する必要がありました。以下を参照してください。]
  2. "20 0.23"これにより、最初の例など、空白だけで出力されます。
  3. 次に、これに関する標準を使用しstrsplit()ます。
  4. 次に、sapply取得したリストを処理するために使用しますstrsplit
  5. 最初の数値を 2 桁の int として出力します。
  6. 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 リム速くなります。この文脈では重要ではありませんが、スピードは長期的には誰にも害を及ぼすことはありません.

于 2012-10-13T21:46:56.890 に答える
0

gsubせいぜい醜い答えはありません。

x <- c("20(0.23)", "15(0.2)", "16(0.09)")

numformat <- function(val) { sub("^(-?)0.", "\\1.", sprintf("%.2f", val)) }
z <- do.call(rbind, strsplit(gsub("\\)", "", x), "\\("))
z[, 2] <- numformat(as.numeric(z[, 2]))
paste0(z[, 1], "(", z[, 2], ")")
于 2012-10-13T20:48:10.773 に答える