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

发布于 2024-12-18 14:07:36 字数 148 浏览 1 评论 0原文

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

as.numeric("10%")

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

I have data with percent signs (%) that I want to convert into numeric. I run into a problem when converting character of percentage to numeric. E.g. I want to convert "10%" into 10%, but

as.numeric("10%")

returns NA. Do you have any ideas?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

绻影浮沉 2024-12-25 14:07:36

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

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

这通过使用 sub 将 % 字符替换为空来实现。

10% is per definition not a numeric vector. Therefore, the answer NA is correct. You can convert a character vector containing these numbers to numeric in this fashion:

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

This works by using sub to replace the % character by nothing.

℉服软 2024-12-25 14:07:36

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

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

Remove the "%", convert to numeric, then divide by 100.

x <- c("10%","5%")
as.numeric(sub("%","",x))/100
# [1] 0.10 0.05
画离情绘悲伤 2024-12-25 14:07:36

如果您是 tidyverse 用户(实际上,如果不是),现在 readr 包中有一个 parse_number 函数:

readr::parse_number("10%")

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

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

If you're a tidyverse user (and actually also if not) there's now a parse_number function in the readr package:

readr::parse_number("10%")

The advantage is generalization to other common string formats such as:

parse_number("10.5%")
parse_number("$1,234.5")
一影成城 2024-12-25 14:07:36

首先去掉无关的字符:(

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

此函数现在处理:前导非数字字符、尾随非数字字符以及保留小数点(如果存在)。

Get rid of the extraneous characters first:

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

(Thanks to Paul for the example data).

This function now handles: leading non-numeric characters, trailing non-numeric characters, and leaves in the decimal point if present.

寂寞清仓 2024-12-25 14:07:36

我想转换整个列并结合上面的答案。

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

I wanted to convert an entire column and combined the above answers.

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']])
故事还在继续 2024-12-25 14:07:36

尝试使用:

> 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

其想法是符号 % 始终位于字符串的末尾。

Try with:

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

This works also with decimals:

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

The idea is that the symbol % is always at the end of the string.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文