パーセンテージの文字を数値に変換するときに問題が発生します。例えば。 「10%」を10%に変換したいのですが、
as.numeric("10%")
NA
を返します。あなたはなにか考えはありますか?
10%は定義ごとに数値ベクトルではありません。したがって、答えNAは正しいです。次の方法で、これらの数値を含む文字ベクトルを数値に変換できます。
percent_vec = paste(1:100, "%", sep = "")
as.numeric(sub("%", "", percent_vec))
これは、subを使用して%文字を何も置き換えないことで機能します。
"%"
を削除し、数値に変換してから100で除算します。
x <- c("10%","5%")
as.numeric(sub("%","",x))/100
# [1] 0.10 0.05
最初に無関係な文字を取り除きます:
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に感謝します)。
この関数は、先頭の非数値文字、末尾の非数値文字を処理し、小数点がある場合はそれを残します。
あなたがtidyverse
ユーザーである場合(実際にはそうでない場合も)、readr
パッケージにparse_number
関数があります:
readr::parse_number("10%")
利点は、次のような他の一般的な文字列形式への一般化です。
parse_number("10.5%")
parse_number("$1,234.5")
で試してください:
> 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
アイデアは、シンボル%
は常に文字列の末尾にあります。
列全体を変換し、上記の回答を組み合わせたいと思いました。
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']])