web-dev-qa-db-fra.com

Comment convertir le caractère du pourcentage en numérique dans R

Je rencontre un problème lors de la conversion du caractère du pourcentage en numérique. Par exemple. Je veux convertir "10%" en 10%, mais

as.numeric("10%")

renvoie NA. Avez-vous des idées?

34
Frank Wang

10% n'est par définition pas un vecteur numérique. Par conséquent, la réponse NA est correcte. Vous pouvez convertir un vecteur de caractères contenant ces nombres en numérique de cette manière:

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

Cela fonctionne en utilisant sub pour remplacer le caractère% par rien.

60
Paul Hiemstra

Retirer le "%", convertissez en numérique, puis divisez par 100.

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

Débarrassez-vous d'abord des caractères étrangers:

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

(Merci à Paul pour les données d'exemple).

Cette fonction gère désormais: les premiers caractères non numériques, les derniers caractères non numériques et laisse le point décimal s'il est présent.

8
Ari B. Friedman

Si vous êtes un utilisateur de tidyverse (et en fait aussi sinon) il y a maintenant un parse_number fonction dans le package readr:

readr::parse_number("10%")

L'avantage est la généralisation à d'autres formats de chaîne courants tels que:

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

Essayez avec:

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

Cela fonctionne également avec les décimales:

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

L'idée est que le symbole % est toujours à la fin de la chaîne.

3
Galled

Je voulais convertir une colonne entière et combiner les réponses ci-dessus.

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