21

文字列があるとしましょう:

strLine <- "The transactions (on your account) were as follows: 0 3,000 (500) 0 2.25 (1,200)"

次の必要なソリューションを生成する配列/ベクトルに数値を取り除く関数はありますか:

result <- c(0, 3000, -500, 0, 2.25, -1200)?

すなわち

result[3] = -500

数値は会計形式で表示されるため、() の間に負の数値が表示されることに注意してください。また、最初に出現した数字の右側には数字のみが表示されると想定できます。私は正規表現が得意ではないので、これが必要な場合は助けていただければ幸いです。また、文字列が常に同じであると想定したくないので、最初の数字の位置の前にあるすべての単語 (および特殊文字) を削除しようとしています。

4

4 に答える 4

40
library(stringr)
x <- str_extract_all(strLine,"\\(?[0-9,.]+\\)?")[[1]]
> x
[1] "0"       "3,000"   "(500)"   "0"       "2.25"    "(1,200)"

括弧をマイナスに変更します。

x <- gsub("\\((.+)\\)","-\\1",x)
x
[1] "0"      "3,000"  "-500"   "0"      "2.25"   "-1,200"

そして、as.numeric()ortaRifx::destringを終了します ( の次のバージョンdestringはデフォルトでネガがサポートされるため、このkeepオプションは必要ありません):

library(taRifx)
destring( x, keep="0-9.-")
[1]    0 3000  -500    0    2.25 -1200

また:

as.numeric(gsub(",","",x))
[1]     0  3000  -500     0     2.25 -1200
于 2012-10-04T13:00:58.993 に答える
23

完全を期すために、基本的なRの方法を次に示します...

x <- unlist(regmatches(strLine, gregexpr('\\(?[0-9,.]+', strLine)))
x <- as.numeric(gsub('\\(', '-', gsub(',', '', x)))
[1]     0.00  3000.00  -500.00     0.00     2.25 -1200.00
于 2012-10-04T14:13:39.377 に答える
1

これは別の質問で出てきたので、これは不必要stringiな解決策です (対stringr松葉杖):

as.numeric(
  stringi::stri_replace_first_fixed(
    stringi::stri_replace_all_regex(
      unlist(stringi::stri_match_all_regex(
        "The transactions (on your account) were as follows: 0 3,000 (500) 0 2.25 (1,200)", 
        "\\(?[0-9,.]+\\)?"
      )), "\\)$|,", ""
    ),
    "(", "-"
  )
)
于 2018-12-03T18:09:32.573 に答える