如何在R中将百分比字符转换为数字

How to convert character of percent into numeric in R

提问人:Frank Wang 提问时间:12/1/2011 最后编辑:Gregor ThomasFrank Wang 更新时间:10/26/2022 访问量:74381

问:

我有带有百分号 (%) 的数据,我想将其转换为数字。在将百分比字符转换为数字时,我遇到了问题。例如,我想将“10%”转换为 10%,但是

as.numeric("10%")

返回。你有什么想法吗?NA

字符 数字 R-FAQ

评论


答:

68赞 Paul Hiemstra 12/1/2011 #1

根据定义,10% 不是数字向量。因此,答案NA是正确的。您可以按以下方式将包含这些数字的字符向量转换为数字:

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

这是通过使用 sub 将 % 字符替换为任何字符来实现的。

34赞 Joshua Ulrich 12/1/2011 #2

删除 ,转换为数字,然后除以 100。"%"

x <- c("10%","5%")
as.numeric(sub("%","",x))/100
# [1] 0.10 0.05
8赞 Ari B. Friedman 12/1/2011 #3

首先去掉多余的字符:

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 提供的示例数据)。

此函数现在处理:前导非数字字符、尾随非数字字符和小数点(如果存在)的离开。

评论

1赞 Ari B. Friedman 12/1/2011
它更复杂,因为它去除了数字后面的任何非数字。
1赞 Ari B. Friedman 12/1/2011
经过编辑,使其也处理前面的字符,并使其成为可以重复使用的函数。
0赞 Ari B. Friedman 12/1/2011
@PaulHiemstra谢谢。我有点犹豫要不要把它弄得太笼统,并且可能仍然更喜欢你的解决方案,因为有任何非“%”、非数字字符可能表明某些东西毕竟不是真正的百分比。因此,返回 NA 可能比让它返回一些合理的内容更可取。
0赞 Paul Hiemstra 12/1/2011
正如您所说,对于更通用的功能,您的解决方案将是可取的。但是,它被称为 percentChar2numeric() 或其他东西,并且 OP 将不得不解决复杂性问题(这将隐藏在函数中)。
2赞 Galled 12/1/2011 #4

尝试:

> 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

这个想法是符号总是在字符串的末尾。%

4赞 nanselm2 1/5/2018 #5

我想转换整个列并合并上述答案。

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

评论

0赞 nanselm2 3/30/2019
谢谢格雷戈尔!修改了我的回复。
1赞 cheevahagadog 5/22/2020
我在第三行的末尾添加了一个以获得正确的浮点值。/ 100
25赞 Giora Simchoni 10/24/2018 #6

如果你是用户(实际上如果不是用户),包中现在有一个函数:tidyverseparse_numberreadr

readr::parse_number("10%")

优点是泛化到其他常见的字符串格式,例如:

parse_number("10.5%")
parse_number("$1,234.5")

评论

5赞 Andrew Brēza 12/11/2018
我真的很喜欢所有旧的 SO 问题,这些问题现在都有性感的 Tidyverse 解决方案。
2赞 sen_saven 6/10/2022
readr::p arse_number(“10%”) 产生 '10' - 这里的数字是 0.1 - tidyverse 可能很性感,但如果它真的有效也会有所帮助:)
0赞 Dannid 4/3/2023
当已经是一个数字时,这也不起作用。我需要我的函数来处理百分比或数值列(取决于正在绘制的列)。 yields (should be ) 并返回错误。对此解决方案投了两张反对票。xreadr::parse_number("-10.5")-10.5-0.105readr::parse_number(-10.5)
0赞 Giora Simchoni 4/4/2023
@Dannid (a) 为什么应该返回而不是 ,它是解析数字的通用函数 (b) 该函数采用“要解析的值的字符向量”,因此导致错误的输入错误,这是有道理的。readr::parse_number("-10.5")-0.105-10.5readr::parse_number(-10.5)
0赞 Dannid 4/27/2023
嗨,@GioraSimchoni看起来我打错了。对于第一个示例,我应该包含百分号:should return 而不是readr::parse_number("-10.5%")-0.105-10.5