r - 从一个模式的第一个匹配中过滤掉行,直到下一个模式的第一个匹配
问题描述
我在列中有一个带有语音数据的数据框speech
。
df <- data.frame(
id = c("A", "A", "B", NA, "A", "B", "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", "y'know what it's like")
)
我需要过滤掉 (i) 由相同的id
AND (ii) 其第一个speech
值是方括号中的内容的行[...]
。但是,过滤器不应该消耗所有相同id
的语音speech
:它应该在匹配圆括号中的(...)
内容或简单文本时立即停止。
我可以过滤df
开条件(i)和(ii):
library(dplyr)
library(data.table)
df %>%
group_by(grp = rleid(id)) %>%
filter(grepl("^\\[.*?\\]$", first(speech)))
这使:
# A tibble: 5 x 3
# Groups: grp [2]
id speech grp
<chr> <chr> <int>
1 B [uh] 2
2 B [erm] 5
3 B (0.4) 5
4 B well 5
5 B y'know what it's like 5
但我不知道如何在speech
with(...)
或 with 文本处停止过滤器。预期的结果是这样的:
# A tibble: 5 x 3
# Groups: grp [2]
id speech grp
<chr> <chr> <int>
1 B [uh] 2
2 B [erm] 5
非常感谢您的帮助!
编辑:
好像我自己找到了解决方案:
df %>%
group_by(grp = rleid(id)) %>%
filter(grepl("^\\[.*?\\]$", first(speech)) & !grepl("^\\(\\d\\.\\d{1}\\)$|^\\w", speech))
但无论如何,感谢所有考虑过的人!
解决方案
推荐阅读
- swagger-ui - 无法从 Swagger UI 和 Thorntail 执行 Rest 方法
- javafx - java - 如何在JavaFX中添加事件侦听器以检测何时选择(单击)GridView中的自定义GridCell?我正在使用 ControlsFX 库
- css - min-width 和 max-width 不适用于 flex,加上与 flex 方向结合
- elasticsearch - elasticsearch 查询花费所有时间在 create_weight
- c# - 如何一次只生成 x 个 html 元素
- unity3d - 为 Unity2d 游戏添加基于 3 星的评分系统
- python - TypeError:“库”对象不可调用
- excel - 停止excel添加额外的引号
- firebase - 在 Firestore 中使用子集合有什么好处吗?
- php - PHP在更新时不更新包含的文件?