R语言删除字符型数值末尾尾零及无意义小数点的实现方法
R语言删除字符型数值末尾尾零及冗余小数点的实现
问题需求
现有如下存储为字符型的数值数据框:
val 4.20 4.00
需要实现两个处理规则:
- 删除数值末尾的所有尾零
- 若删除尾零后小数点后无有效数字,同步删除多余的小数点
最终期望输出如下:
val 4.2 4
最初使用str_remove直接匹配末尾0删除的代码,会在处理4.00这类全零小数的场景时残留小数点,得到不符合要求的4.结果,原始代码如下:
library(tidyverse) data.frame(val = c("4.20", "4.00")) %>% mutate(val = str_remove(val, "0+$"))
注:数据必须保留字符型存储格式,且方案需要兼容普通非数值字符串的场景,避免误改非数值内容。
最终解决方案
通过自定义校验+处理函数可覆盖所有边界场景,函数代码如下:
decimal_func <- function(x) { # 校验是否为合法数值字符串:仅包含数字和最多1个小数点 decimalVal_check <- function(y) { case_when( str_count(y, "\\.") <= 1 & str_detect(str_replace(y, "\\.", ""), "^[:digit:]+$") == T ~ "Valid", TRUE ~ "Invalid" ) } if(decimalVal_check(x) == "Valid") { # 无小数点的整数直接返回 if(str_count(x, "\\.") == 0) { x } else { # 先删末尾尾零,再判断末尾是否为小数点,是就删掉 str_remove(x, "0+$") %>% ifelse(substr(., nchar(.), nchar(.)) == ".", str_replace(., "\\.", ""), .) } } else { # 非数值字符串原样返回 x } }
调用示例
直接对数据框的列逐元素调用函数即可:
data.frame(val = c("4.20", "4.00", "测试文本", "123", "123.4500")) %>% mutate(val = sapply(val, decimal_func))
运行后所有合法数值字符串会按规则处理,非数值内容原样保留,完全符合需求。
内容的提问来源于stack exchange,提问作者DJC
相关产品推荐
相关产品推荐

