过滤至少两个模式匹配的位置

时间:2019-04-12 15:58:42

标签: r data.table subset

我在data.table中有很多文本数据。我有几种感兴趣的文本模式。我想对表进行子集化,以便它显示与至少两个模式匹配的文本。

由于某些模式已经是“或”之类的事实(例如像"paul|john"这样的事实,这使情况变得更加复杂)。

我想我要么想要一个表示直接基于该子集的表达式,要么替代地,如果我可以计算模式发生的次数,那么我可以将其用作子集的工具。我已经知道了计算模式发生次数的方法,但是没有办法将信息清楚地链接到原始数据集中的ID(如果可以的话)。

目前,我能想到的最好的方法是为每个模式在data.table中添加一列,检查每个模式是否分别匹配,然后根据模式的总和进行过滤。这似乎很令人费解,所以我希望有一种更好的方法,因为要检查的模式很多!

示例数据

text_table <- data.table(ID = (1:5), text = c("lucy, sarah and paul live on the same street",
                                              "lucy has only moved here recently",
                                              "lucy and sarah are cousins",
                                              "john is also new to the area",
                                              "paul and john have known each other a long time"))
text_patterns <- as.character(c("lucy", "sarah", "paul|john"))

对于示例数据,我希望在子数据中使用ID 1和3。

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

我们可以用paste |来'text_patterns',用它作为'str_count'中的模式来获取匹配子串的计数,并检查它是否大于1来过滤行data.table

library(data.table)
text_table[str_count(text, paste(text_patterns, collapse="|")) >1]
#    ID                                            text
#1:  1    lucy, sarah and paul live on the same street
#2:  3                      lucy and sarah are cousins
#3:  5 paul and john have known each other a long time

更新

如果我们需要将每个“ text_pattern”视为固定模式,则可以遍历这些模式,检查是否存在该模式(str_detect),并使用{获得所有模式的sum {1}}创建用于子集行的逻辑向量

+