1

Rでそれを行う方法についてのアイデアをいただければ幸いです。問題は次のとおりです。ラテックステーブルが保存されています。表中の数字はすべて小数点以下3桁を装備しています。これらの数字を切り取り、他の数字をテーブルに残します。(見積もり結果を表す数字を考えてみてください。ただし、次元は「ドル」です。この場合、145.553 という値はあまり意味がなく、145 で十分です)。これらのテーブルを作成した人はこれについてあまり考えていなかったので、ここではテーブルを手作業で調べないようにしています。:)

これまでのところ、文字列から数値を抽出する方法についてのさまざまな解決策しか見つかりませんでした。それ以外の場合、文字列自体が変更されないように数値を変更する方法は見つかりませんでした。

例:

 strings <- c(
 "a.name      & $-436.735  $   & $-710.832$   \\\\", 
 "std(a.name) & $(1403.604)$   & $(1274.283)$ \\\\", 
 )

ソリューションが返されるはずです

 strings <- c(
 "a.name      & $-436  $   & $-710$   \\\\", 
 "std(a.name) & $(1403)$   & $(1274)$ \\\\", 
 )

もちろん、丸めを正しく行うことができれば、さらに優れたものになります。しかし、これは最も重要なことではありません。

gsubwithを使用し\\....て、ピリオドの後に他の 3 つの数字が続く文字列を識別しようとしましたが、これによりa.name、私の例では変数名も得られます。

私がやりたいことをどのように達成できるか考えている人はいますか?

前もって感謝します!

4

2 に答える 2

3

これは、基数 R のgregexprregmatches、およびregmatches<-を使用して、任意の数値を小数部分で丸めます。

.789(つまり、小数点の前に数字がない) や-0.4(マイナス記号のない数値に丸められる) のような数値でも正しく機能します。パフォーマンスが理想的とは言えない状況の 1 つは、 のような数値から末尾の小数点を削除しないこと10.です。

string <- c("a.name      & $-436.735  $   & $-710.832$   \\\\", 
            "std(a.name) & $(1403.604)$   & $(1274.283)$ \\\\")

f <- function(x) {
    pat <- "(-)?[[:digit:]]+\\.[[:digit:]]*"
    m <- gregexpr(pat, x)
    regmatches(x,m) <- lapply(regmatches(x,m), function(X) round(as.numeric(X)))
    x
}

f(string)
# [1] "a.name      & $-437  $   & $-711$   \\\\"
# [2] "std(a.name) & $(1404)$   & $(1274)$ \\\\"
于 2013-11-05T19:34:27.853 に答える
2
gsub(strings, pattern ="\\.[[:digit:]]{3}", replacement = "")
#[1] "a.name      & $-436  $   & $-710$   \\\\" "std(a.name) & $(1403)$   & $(1274)$ \\\\"

丸めを取得するには、これらの行に沿って何かを行いますが、括弧により少し見苦しくなります-

sapply(
  strsplit(
    strings,
    "\\$|\\$\\(|\\)\\$"
  ),
  function(x) 
    paste(
      x[1],'$',
      ifelse(as.numeric(x[2]) <0, round(as.numeric(x[2]),0),paste0("(",round(as.numeric(x[2]),0),")")),'$',
      x[3],'$',
      ifelse(as.numeric(x[4]) <0, round(as.numeric(x[4]),0),paste0("(",round(as.numeric(x[4]),0),")")),'$',
      x[5]
      )
)
#[1] "a.name      &  $ -437 $    &  $ -711 $    \\\\"   "std(a.name) &  $ (1404) $    &  $ (1274) $  \\\\"
于 2013-11-05T19:10:29.787 に答える