我正在使用agrepl()
通过模糊匹配单词来过滤 data.table。这对我来说很好,使用这样的东西:
library(data.table)
data <- as.data.table(iris)
pattern <- "setosh"
dt <- data[, lapply(.SD, function(x) agrepl(paste0("\\b(", pattern, ")\\b"), x, fixed = FALSE, ignore.case = TRUE))]
data<- data[rowSums(dt) > 0]
head(data)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1: 5.1 3.5 1.4 0.2 setosa
2: 4.9 3.0 1.4 0.2 setosa
3: 4.7 3.2 1.3 0.2 setosa
4: 4.6 3.1 1.5 0.2 setosa
5: 5.0 3.6 1.4 0.2 setosa
6: 5.4 3.9 1.7 0.4 setosa
显然,通过查看这个,您可以看到在这种情况下“setos”将与“setosa”模糊匹配。我想要的是获得与“setosh”匹配的单词向量。所以虽然在这个例子中不相关,但如果它包含另一个类别,如“seposh”,那也会匹配,所以你会有一个向量是c("setosa", "seposh")
.
编辑:
感谢下面的答案 - 我可以看到如何在仅查看向量时隔离发生模糊匹配的值,但我的问题是:
- 我只想要匹配的字符串,而不是整个值。
- 我无法在我的 data.table 上复制它。
例如,如果我更改一个值以更容易地说明这一点......
data <- as.data.table(iris)
data[Species == "versicolor", Species := "setosh species"] # changing a value so it would match
pattern <- "setosh"
dt <- data[, lapply(.SD, function(x) agrep(paste0("\\b(", pattern, ")\\b"), x, value = TRUE, fixed = FALSE, ignore.case = TRUE))]
Warning messages:
1: In as.data.table.list(jval) :
Item 1 is of size 0 but maximum size is 100, therefore recycled with 'NA'
2: In as.data.table.list(jval) :
Item 2 is of size 0 but maximum size is 100, therefore recycled with 'NA'
3: In as.data.table.list(jval) :
Item 3 is of size 0 but maximum size is 100, therefore recycled with 'NA'
4: In as.data.table.list(jval) :
Item 4 is of size 0 but maximum size is 100, therefore recycled with 'NA'
unique(dt)
Species
1: setosa
2: setosh species
您可以看到我没有在向量中得到结果,并且结果包括完整的值“setosh species”,而不仅仅是“setosh”(作为匹配的部分)。
希望这更有帮助!