Я столкнулся с проблемой при преобразовании символа процента в числовой. Например. Я хочу преобразовать "10%" в 10%, но
as.numeric("10%")
возвращает NA
. У вас есть идеи?
Я столкнулся с проблемой при преобразовании символа процента в числовой. Например. Я хочу преобразовать "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
(Спасибо Павлу за данные примера).
Эта функция теперь обрабатывает: ведет нечисловые символы, заканчивая нечисловыми символами и оставляет в десятичной точке, если они есть.
Если вы tidyverse
пользователя (и на самом деле также, если нет) там теперь parse_number
функция в readr
упаковке:
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
Идея состоит в том, что символ %
всегда находится в конце строки.
Я хотел преобразовать весь столбец и объединил вышеупомянутые ответы в функцию sapply:
pct_to_number<- function(x){
x_replace_pct<-sub("%", "", x)
x_as_numeric<-as.numeric(x_replace_pct)
}
df['ColumnName'] = sapply(df['ColumnName'], pct_to_number)
В пакете scales
есть функция процента, которая делает это очень легко.
as.numeric(percent('10%'))