Policz częstotliwość słów w słowniku w kolumnie i wygeneruj nową kolumnę „dictfreq”

Nov 24 2020

Wydaje się, że to proste polecenie, ale nie mogę znaleźć dobrego sposobu wygenerowania tego w R. Zasadniczo chcę tylko policzyć częstotliwość każdego słowa w słowniku, dyktować, w kolumnie innej ramki danych, wordsgov:

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"

pożądane wyjście: nowy ranking częstotliwości, pokazujący wszystkie słowa w dyktandzie zgodnie z ich częstotliwością w df $ wordsgov

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

Wypróbowałem poniższy kod, ale podał mi, ile razy słowa dyktowania pojawiają się w każdym wierszu df $ wordgov, co nie jest tym, czego chcę:

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

Wydaje się, że nie wiem, jak zmienić tę funkcję, aby zamiast tego podawała częstotliwość dla każdego słowa dyktu w dict $ wordsgov. próbowałem str_detect, ale to też nie działa. jakakolwiek pomoc byłaby naprawdę doceniona !!!

- edycja: użyłem następujących, które działały dobrze.

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

jednak usunął wszystkie słowa, które miały częstotliwość 0. Czy jest jakiś sposób, aby zachować słowa z częstotliwością 0? Próbowałem ".drop = FALSE", ale wygląda na to, że nie działa w tym kodzie. jakakolwiek pomoc byłaby naprawdę doceniona. dzięki!

Odpowiedzi

akrun Nov 24 2020 at 21:50

Możemy to również zrobić za pomocą 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)

dane

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")