web-dev-qa-db-ja.com

Rでパーセンテージの文字を数値に変換する方法

パーセンテージの文字を数値に変換するときに問題が発生します。例えば。 「10%」を10%に変換したいのですが、

as.numeric("10%")

NAを返します。あなたはなにか考えはありますか?

34
Frank Wang

10%は定義ごとに数値ベクトルではありません。したがって、答えNAは正しいです。次の方法で、これらの数値を含む文字ベクトルを数値に変換できます。

percent_vec = paste(1:100, "%", sep = "")
as.numeric(sub("%", "", percent_vec))

これは、subを使用して%文字を何も置き換えないことで機能します。

60
Paul Hiemstra

"%"を削除し、数値に変換してから100で除算します。

x <- c("10%","5%")
as.numeric(sub("%","",x))/100
# [1] 0.10 0.05
28
Joshua Ulrich

最初に無関係な文字を取り除きます:

topct <- function(x) { as.numeric( sub("\\D*([0-9.]+)\\D*","\\1",x) )/100 }
my.data <- paste(seq(20)/2, "%", sep = "")
> topct( my.data )
 [1] 0.005 0.010 0.015 0.020 0.025 0.030 0.035 0.040 0.045 0.050 0.055 0.060 0.065 0.070 0.075 0.080
[17] 0.085 0.090 0.095 0.100

(サンプルデータを提供してくれたPaulに感謝します)。

この関数は、先頭の非数値文字、末尾の非数値文字を処理し、小数点がある場合はそれを残します。

8
Ari B. Friedman

あなたがtidyverseユーザーである場合(実際にはそうでない場合も)、readrパッケージにparse_number関数があります:

readr::parse_number("10%")

利点は、次のような他の一般的な文字列形式への一般化です。

parse_number("10.5%")
parse_number("$1,234.5")
7
Giora Simchoni

で試してください:

> x = "10%"
> as.numeric(substr(x,0,nchar(x)-1))
[1] 10

これは小数でも機能します:

> x = "10.1232%"
> as.numeric(substr(x,0,nchar(x)-1))
[1] 10.1232

アイデアは、シンボル%は常に文字列の末尾にあります。

3
Galled

列全体を変換し、上記の回答を組み合わせたいと思いました。

pct_to_number<- function(x){
  x_replace_pct<-sub("%", "", x)
  x_as_numeric<-as.numeric(x_replace_pct)
  }
df[['ColumnName']] = pct_to_number(df[['ColumnName']])
1
nanselm2