首页 > 解决方案 > 根据正则表达式模式和 ID 过滤行

问题描述

我有一个df这样的:

df <- data.frame(
  id = c("A", "A", "B", NA, "A", "B", "B", "B"),
  speech = c("hi", "how are you [Larry]?", "[uh]", "(0.123)", "I'm fine [you 'n Mary] how's it [goin]?", "[erm]", "(0.4)", "well")
)

我想过滤掉那些完全由从字符串开始到字符串结束speech的方括号括起来的表达式组成的行 (1) 和 (2) 那些与构成整个的行相同的。我知道如何过滤掉行:[...]ID[...]speech[...]

df %>%
  group_by(grp = rleid(id)) %>%
  filter(grepl("^\\[.*?\\]$", speech))

但我不知道如何过滤掉该ID行之后的相同[...]行。所需的输出是这样的:

df
  id speech
1  B   [uh]
2  B  [erm]
3  B  (0.4)
4  B   well

标签: rfilterdplyr

解决方案


rleid使用OP 的代码创建分组索引,然后删除在“语音”元素中filter没有 a[的组,firstungroup

library(dplyr)
library(data.table)
library(stringr)
df %>% 
    group_by(grp = rleid(id)) %>% 
    filter(str_detect(first(speech), "^\\[")) %>% 
    ungroup  %>%
    select(-grp)

-输出

# A tibble: 4 x 2
#  id    speech
#  <chr> <chr> 
#1 B     [uh]  
#2 B     [erm] 
#3 B     (0.4) 
#4 B     well  

编辑:基于@ChrisRuehlemann 的评论


推荐阅读