2

次のような文字列を持つ:

x <- c("31.12.2009EUR", "31.12.2009", "23.753,38", "0,00")

として解析したいと思います

c(NA, NA, 23753.38, 0.00)

私は試した:

require(readr)
parse_number(x, locale=locale(decimal_mark = ",")) # This ignores the grouping_mark
#> 31122009.00 31122009.00    23753.38        0.00

parse_double(x, locale=locale(decimal_mark = ","))
#> NA NA NA  0

私が思いついた唯一の方法:

out <- rep(NA, length(x))
ind <- grep("^[0-9]{1,3}(\\.[0-9]{3})*\\,[0-9]{2}", x)
out[ind] <- parse_number(x[ind],locale=locale(decimal_mark = ","))
out
4

1 に答える 1

2

このワンライナーでは、パッケージも複雑な正規表現も使用しません。有効な要素にはカンマがあり、無効な要素にはカンマがないことを前提としています。これは、示されているサンプル入力で機能しますが、実際のデータにない場合はgrepl、基準が何であれ、より複雑な正規表現を使用してください。

as.numeric(ifelse(grepl(",", x), chartr(",", ".", gsub(".", "", x, fixed = TRUE)), NA))
## [1]       NA       NA 23753.38     0.00
于 2016-11-26T17:09:04.103 に答える