列内の辞書の単語の頻度をカウントし、新しい「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")