Как преобразовать символ процента в число в R - PullRequest
34 голосов
/ 30 ноября 2011

Я сталкиваюсь с проблемой при преобразовании символа процента в число. Например. Я хочу конвертировать "10%" в 10%, но

as.numeric("10%")

возвращает NA. У вас есть идеи?

Ответы [ 6 ]

59 голосов
/ 30 ноября 2011

10% по определению не числовой вектор. Поэтому ответ НС правильный. Вы можете преобразовать вектор символов, содержащий эти числа, в числовой таким образом:

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

Это работает с помощью sub, чтобы заменить символ% ничем.

28 голосов
/ 30 ноября 2011

Удалить "%", преобразовать в числовое значение, а затем разделить на 100.

x <- c("10%","5%")
as.numeric(sub("%","",x))/100
# [1] 0.10 0.05
8 голосов
/ 30 ноября 2011

Сначала избавьтесь от посторонних символов:

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

(спасибо Павлу за данные в качестве примера).

Эта функция теперь обрабатывает: начальные нечисловые символы, завершающие не-числовые символы и оставляют в десятичной точке, если есть.

7 голосов
/ 24 октября 2018

Если вы пользователь tidyverse (а на самом деле также, если нет), теперь в пакете readr есть функция parse_number:

readr::parse_number("10%")

Преимущество заключается в обобщении на другую общую строкуформаты, такие как:

parse_number("10.5%")
parse_number("$1,234.5")
3 голосов
/ 30 ноября 2011

Попробуйте с:

> 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

Идея состоит в том, что символ % всегда находится в конце строки.

1 голос
/ 05 января 2018

Я хотел преобразовать весь столбец и объединил приведенные выше ответы.

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']])
...