2017-06-30 15 views
2

私はいくつかのテキストデータを持つ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"を含む行だけを返しますか?

答えて

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 
+0

お返事ありがとうございました。実際には、正規表現のアプローチは、単語列が別のより大きい単語の一部である場合に予期しない動作を引き起こす可能性があるため、しばらく開いたままにします。 "cat"は "catastrophic"である。 –

+0

問題はありません。別の考え方は、 'strsplit'を使って各行を分割し、' sapply'を使って行内の要素のいずれかが一致するかどうかを確認することです。 –

+0

トリックはありますか?私は個人的に私は非正規表現の方法で何が起こっていることに従うことができると思うので、これを行うの "dplyr esque"の方法があるのだろうかと思うが、読むのは難しいです。とにかく、ありがとう –