如何用R语言从数据集中筛选保留非整数小数数值?
解决R语言筛选带非零小数部分数值的问题
我明白你想要从给定数据集里筛选出带有非零小数部分的数值,之前用正则没成功的话,其实用数值判断的方法会更准确可靠,当然也可以调整正则表达式来实现,下面给你两种可行方案:
方法一:数值判断(推荐)
这种方法不需要转换为字符串,直接通过数值运算判断是否存在非零小数部分,能避免字符串格式带来的问题(比如569.00这类本质是整数的数值会被正确排除)。
首先构造你的数据集向量:
data <- c(1234, 123.45, 123.98, 569.00, 569.78, 234.98, 2347.1, 898.11, 689, 598.1, 569, 781)
然后用floor()函数获取每个数值的整数部分,判断原数值是否不等于整数部分(不等于就说明有非零小数):
filtered_data <- data[data != floor(data)] # 查看筛选结果 filtered_data
运行后会得到你需要的结果:123.45 123.98 569.78 234.98 2347.1 898.11 598.1
方法二:调整正则表达式实现
如果一定要用正则,需要先把数值转为字符串,然后匹配小数点后至少有一个非零数字的情况,这样就能排除569.00这类数值:
# 将数值转为字符串格式 data_str <- as.character(data) # 正则匹配:小数点后存在非零数字(包括前面有零但后续有非零的情况) filtered_str <- data_str[grepl("\\.([1-9]|0+[1-9])", data_str)] # 转回数值类型 filtered_data <- as.numeric(filtered_str) filtered_data
为什么之前正则可能失败?
大概率是因为你的正则没有排除小数点后全是零的情况,比如如果用简单的\\.来匹配带小数点的数值,会把569.00也包含进去,这不符合你的需求。而上面的正则会精准匹配有有效小数部分的数值。
内容的提问来源于stack exchange,提问作者Praveen M Kulkarni
相关产品推荐
相关产品推荐

