提问人:Frank Wang 提问时间:12/1/2011 最后编辑:Gregor ThomasFrank Wang 更新时间:10/26/2022 访问量:74381
如何在R中将百分比字符转换为数字
How to convert character of percent into numeric in R
问:
我有带有百分号 (%) 的数据,我想将其转换为数字。在将百分比字符转换为数字时,我遇到了问题。例如,我想将“10%”转换为 10%,但是
as.numeric("10%")
返回。你有什么想法吗?NA
答:
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
如果你是用户(实际上如果不是用户),包中现在有一个函数:tidyverse
parse_number
readr
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 ) 并返回错误。对此解决方案投了两张反对票。x
readr::parse_number("-10.5")
-10.5
-0.105
readr::parse_number(-10.5)
0赞
Giora Simchoni
4/4/2023
@Dannid (a) 为什么应该返回而不是 ,它是解析数字的通用函数 (b) 该函数采用“要解析的值的字符向量”,因此导致错误的输入错误,这是有道理的。readr::parse_number("-10.5")
-0.105
-10.5
readr::parse_number(-10.5)
0赞
Dannid
4/27/2023
嗨,@GioraSimchoni看起来我打错了。对于第一个示例,我应该包含百分号:should return 而不是readr::parse_number("-10.5%")
-0.105
-10.5
评论