如何计算 word/token 在 one-token-per-document-per-row tibble 中的出现次数

How to count occurrences of a word/token in a one-token-per-document-per-row tibble

你好,我在 tidytext::unnest_tokens()count(category, word, name = "count") 的管道中有一个小问题。看起来像这个例子。

owl <- tibble(category = c(0, 1, 2, -1, 0, 1, 2),
              word = c(rep("hello", 3), rep("world", 4)),
              count = sample(1:100, 7))

并且我想通过一个额外的列来获取此小标题,该列给出了该词出现的类别数,即该词每次出现的类别数相同。

我尝试了以下原则上有效的代码。结果就是我想要的。

owl %>% mutate(sum_t = sapply(1:nrow(.), function(x) {filter(., word == .$word[[x]]) %>% nrow()}))

但是,看到我的数据有几千行,这需要相当长的时间。有没有更有效的方法来实现这个?

我们可以使用 add_count:

library(dplyr)

 owl %>% 
   add_count(word)

输出:

  category word  count     n
     <dbl> <chr> <int> <int>
1        0 hello    98     3
2        1 hello    30     3
3        2 hello    37     3
4       -1 world    22     4
5        0 world    80     4
6        1 world    18     4
7        2 world    19     4

我尝试了一些解决方案和微基准测试。我将 TarJae 的提议添加到基准测试中。我还想使用神奇的 ave 函数,看看它与 dplyr 解决方案相比如何。

library(microbenchmark)

n <- 500

owl2 <- tibble(
  category = sample(-10:10, n , replace = TRUE),
  word = sample(stringi::stri_rand_strings(5, 10), n, replace = TRUE),
  count = sample(1:100, n, replace = TRUE))

mb <- microbenchmark(
  op = owl2 %>% mutate(sum_t = sapply(1:nrow(.), function(x) {filter(., word == .$word[[x]]) %>% nrow()})),
  group_by = owl2 %>% group_by(word) %>% mutate(n = n()), 
  add_count = owl2 %>% add_count(word), 
  ave = cbind(owl2, n = ave(owl2$word, owl2$word, FUN = length)), 
  times = 50L)

autoplot(mb) + theme_bw()

结论是使用 add_count 的优雅解决方案将为您节省大量时间,并且大大加快了过程。