【问题标题】:how to filter numbers that end with .0 or .5?如何过滤以 .0 或 .5 结尾的数字?
【发布时间】:2019-06-18 15:06:19
【问题描述】:

我正在尝试过滤掉所有包含不以 $.0、$.00、$.50 或 $.5 结尾的票价的数据

票价栏应始终以$.0, $.00, $.50, $.5结尾

我的数据如下所示:

df = 
 |date      |id   |fare
1|2018-11-25|12345|5.50
2|2018-11-26|12345|2.0
3|2018-11-26|12355|2.61
4|2018-11-27|12345|12.60
5|2018-11-27|12348|22.65

我尝试使用 grepl 函数,但它只是解决了我的问题。它包含了我想要的内容,但缺少很多我预计会出现的数据。

df[grepl("\\.(?:.00$|.0$|.50$|.5$)$",df$fare), ]

我想创建一个包含第 3:5 行的新 df

dfgood = 
 |date      |id   |fare
3|2018-11-26|12355|2.61
4|2018-11-27|12345|12.60
5|2018-11-27|12348|22.65

【问题讨论】:

  • 小提示:如果你先将它们全部乘以 100,事情可能会更简单。
  • 行 3:5 应该在最终输出中,因为?
  • 你可以试试df[df$fare %% .5 > 0, ]
  • 真的取决于你的数据是数字还是字符。如果是字符,请坚持使用grepl 方法。如果是数字,则乘以 %%

标签: r regex tidyr stringr grepl


【解决方案1】:

使用base r的解决方案

##create some basic data
df = data.frame(date = c(1,2,3,4,5),
        id = c(12345,12345,12355,12345,12348),
        fare = c(5.5,2,2.61,12.60,22.65))


df[which(!(df$fare %% 1) %in% c(0.5,0)),]

【讨论】:

  • 我喜欢你所说的base r,你做的第一件事就是调用tibble
  • 哈哈但真的很好的解决方案
  • 太棒了。您介意确认答案并点赞吗?
  • 很遗憾还不能投票,但我给了你支票!
【解决方案2】:

你去吧:

library(dplyr)
dfgood <- df %>% filter((100*fare)%%50!=0)

【讨论】:

    【解决方案3】:

    这个regex 应该这样做

    # If stored as character
    df[!grepl('\\.5$|\\.0$|\\.00$|\\.50$', df$fare, perl = TRUE),]
    # Else
    df[!grepl('\\.5$|\\.0$|\\.00$|\\.50$', format(round(df$fare, 2), nsmall = 1), perl = TRUE),]
    

    【讨论】:

    • 这成功了!感谢您能够修改我的代码 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-12
    • 1970-01-01
    • 2015-03-03
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    相关资源
    最近更新 更多