подмножество/фильтр на основе таблицы частот

У меня есть df с некоторыми текстовыми данными, например.

words <- data.frame(terms = c("qhick brown fox",
                              "tom dick harry", 
                              "cats dgs",
                              "qhick black fox"))

Я уже могу составить подмножество на основе любой строки, содержащей орфографическую ошибку:

library(qdap)
words[check_spelling(words$terms)$row,,drop=F]

Но, учитывая, что у меня много текстовых данных, я хочу фильтровать только орфографические ошибки, которые встречаются чаще:

> sort(which(table(which_misspelled(toString(unique(words$terms)))) > 1), decreasing = T)
qhick 
    2 

Итак, теперь я знаю, что это «qhick» — распространенная ошибка в написании.

Как я мог затем подмножить слова на основе этой таблицы? То есть возвращать только те строки, которые содержат «qhick»?


person Doug Fir    schedule 30.06.2017    source источник


Ответы (1)


Сами слова являются именами вашей sort() функции. Если у вас есть только одно имя, вы можете сделать:

top_misspelled <- sort(which(table(which_misspelled(toString(unique(words$terms)))) > 1), decreasing = T)

words[grepl(names(top_misspelled), words$terms), , drop = F]
#            terms
#1 qhick brown fox
#4 qhick black fox

Но если у вас их несколько, вы можете свернуть их вместе, чтобы построить поиск grepl, например:

words[grepl(paste0(names(top_misspelled), collapse = "|"), words$terms), ,drop = F]

Вариант без регулярного выражения также будет состоять в том, чтобы разбить каждую строку на слова, а затем, если какое-либо из слов в строке соответствует интересующим вас строкам, вернуть эту строку:

words[sapply(strsplit(as.character(words[,"terms"]), split=" "), function(x) any(x %in% names(top_misspelled))),
      ,drop = F]

#            terms
#1 qhick brown fox
#4 qhick black fox
person Mike H.    schedule 30.06.2017
comment
Спасибо за ответ и извините за неприятие. На самом деле, я хочу оставить его открытым на некоторое время, поскольку подход с регулярным выражением может вызвать неожиданное поведение, когда строка слова является частью другого более крупного слова, например. кот в катастрофе. - person Doug Fir; 30.06.2017
comment
Нет проблем, другой идеей было бы разделить каждую строку, используя strsplit, а затем использовать sapply, чтобы проверить, совпадают ли какие-либо элементы в строке. - person Mike H.; 30.06.2017
comment
Спасибо, что делает трюк! Интересно, есть ли способ сделать это в духе dplyr, поскольку я думаю, что могу лично следить за тем, что происходит с методом без регулярных выражений, но его сложно читать. В любом случае, еще раз спасибо - person Doug Fir; 30.06.2017