列内の辞書の単語の頻度をカウントし、新しい「dictfreq」列を生成します

Nov 24 2020

単純なコマンドのように見えますが、Rでこれを生成する良い方法を見つけることができないようです。基本的に、別のデータフレームの列wordsgov内の辞書dictの各単語の頻度を数えたいだけです。

dict = "apple", "pineapple","pear"
df$wordsgov = "i hate apple", "i hate apple", "i love pear", "i don't like pear", "pear is okay", "i eat pineapple sometimes"

必要な出力:新しい頻度ランキング、df $ wordsgov内の頻度に従ってdict内のすべての単語を表示

dict    freq_gov
"pear" : 3
"apple": 2
"pineapple: 1

次のコードを試しましたが、df $ wordgovの各行に辞書の単語が表示される回数がカウントされました。これは、私が望むものではありません。

dictongov <- within(
  df,
  counts <- sapply(
    gregexpr(paste0(dict, collapse = "|"), wordsgov),
    function(x) sum(x > 0)
  )
)

関数を変更して、代わりにdict $ wordsgovのdictの各単語の頻度を取得する方法を理解できないようです。str_detectを試しましたが、機能しません。どんな助けでも本当にありがたいです!!!

-編集:私は以下を使用しましたが、これはうまくいきました。

dictfreq <- df %>% mutate(dict = str_c(str_extract(wordsgov, str_c(dict, collapse = '|')), ':')) %>% 
                   count(dict, name = 'freq_gov') %>% arrange(desc(freq_gov))

ただし、頻度が0の単語をすべて削除しました。頻度が0の単語を保持する方法はありますか?「.drop = FALSE」を試しましたが、このコード内では機能していないようです。どんな助けでも本当にありがたいです。ありがとう!

回答

akrun Nov 24 2020 at 21:50

これは次の方法でも実行できます str_count

library(stringr)
library(purrr)
out <- map_int(str_c("\\b", v2, "\\b"), ~  sum(str_count(v1, .x)))
out
#[1] 2 1 3

rank(out)

データ

v1 <- c("i hate apple", "i hate apple", "i love pear", "i don't like pear", 
       "pear is okay", "i eat pineapple sometimes")

v2 <- c("apple", "pineapple", "pear")