【问题标题】:Filter out records with a pattern in R dataframe using dplyr with regex使用带有正则表达式的 dplyr 过滤掉 R 数据框中具有模式的记录
【发布时间】:2018-12-23 13:24:21
【问题描述】:

我试图仅提取 col1 中具有日期的记录并过滤掉其他记录。问题是我的变量没有固定的数据格式。所以我在 R 中的 dplyr 包上使用正则表达式并进行模式匹配。能够从数据集中过滤文本数据。但是无法过滤掉只有“2018”的记录。任何帮助将不胜感激。

library(dplyr)
library(re)
library(stringr)
data1 <- data.frame( c( "sds_ds", "2018/01/11", "02/04/2018","2018"), c( 2018, 76, 35,45), c( 2017, 79, 38,46 ))
names(data1) <- c("col1", "col2", "col3")
data1

data1_clean = data1 %>% 
  filter(!str_detect(col1, pattern = "[a-z]"))
data1_clean

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    如果我们 filtering out 'col1' 中只有年份的行,一个选项是否定

    library(stringi)
    library(dplyr)
    data1 %>% 
       filter(str_detect(col1, '[0-9/]'), 
              !stri_detect(col1, regex = "^[0-9]{4}$"))
    
    #         col1 col2 col3
    #1 2018/01/11   76   79
    #2 02/04/2018   35   38
    

    【讨论】:

    • 这会带来文本为“sds_ds”的数据,这不是必需的。在这个例子中它应该只显示2条记录。但我明白你的意思。谢谢。
    • @Akash 谢谢,我没注意到。已编辑
    • 谢谢你.. 我学到了另一个概念,我们可以在同一个过滤器中使用逗号分隔符传递多个 str_detect。
    【解决方案2】:

    我们可以根据我们拥有的日期格式定义正则表达式并在filter中使用它

    library(dplyr)
    
    data1 %>% filter(grepl("[0-9]{2,4}\\/[0-9]{2}\\/[0-9]{2,4}", col1))
    
    
    #        col1 col2 col3
    #1 2018/01/11   76   79
    #2 02/04/2018   35   38
    

    等价于基础 R

    data1[grepl("[0-9]{2,4}\\/[0-9]{2}\\/[0-9]{2,4}", data1$col1), ]
    

    【讨论】:

    • 感谢您的回复。在这里,您将度过 2018 年,但它可以是任何一年。我也只想记录第二和第三。并从我的数据集中删除第一条和第四条记录。
    • @Akash 更新了答案,看看它是否适合您的情况。
    猜你喜欢
    • 1970-01-01
    • 2021-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-24
    • 2014-11-06
    • 2018-01-11
    • 2019-11-01
    相关资源
    最近更新 更多