R语言 如何根据包含______I I__. 000小数“版本”列筛选数据集?

9bfwbjaz  于 2022-12-06  发布在  其他
关注(0)|答案(1)|浏览(133)

我有一个数据集,我试图根据3个不同的列进行筛选。
我有2列的字符值计算出来的执行:过滤器(TRANSACTION_TYPE!=“ABC”,CUSTOMER_CODE ==“123”)但是,我有一个“VERSION”列,其中每个客户都有多个版本,这些版本将复制我的$金额。我希望仅筛选包含小数点“.000”的版本,因为.000表示最终和最准确的版本。例如,版本可以= 20220901.000和20220901.002(enter image description here)、20220901.003等。但是,小数点前的数字总是会变化,因此我无法对其进行过滤以使其等于20220901,因为它会按天变化。
我希望我说得够清楚了,谢谢!

lyr7nygr

lyr7nygr1#

示例数据:

quux <- data.frame(VERS_chr = c("20220901.000","20220901.002","20220901.000","20220901.002"),
                   VERS_num = c(20220901.000,20220901.002,20220901.000,20220901.002))

如果数据中is.character(quux$VERSION)为真,则

dplyr::filter(quux, grepl("\\.000$", VERS_chr))
#       VERS_chr VERS_num
# 1 20220901.000 20220901
# 2 20220901.000 20220901

说明:

  • "\\.000$"匹配字符串($)末尾的文本句点.(由于它是正则表达式保留符号,因此需要转义)后跟三个文本零000。有关正则表达式的更多信息,请参见https://stackoverflow.com/a/22944075/3358272

如果为false(并且不是factor),则

dplyr::filter(quux, abs(VERS_num %% 1) < 1e-3)
#       VERS_chr VERS_num
# 1 20220901.000 20220901
# 2 20220901.000 20220901

说明:

  • abs(.) < 1e-3可以防御高精度的相等性测试,因为浮点数的限制(通常在计算机中)并不总是将非常接近零的数字视为零。请参阅Why are these numbers not equal?,https://cran.r-project.org/doc/FAQ/R-FAQ.html#Why-doesn_0027t-R-think-these-numbers-are-equal_003f。
  • . %% 1是模数运算符,将数字缩减到其小数部分。

相关问题