在 r 中使用 mutate 添加观测值的计数/计数

Adding a tally/count of observations using mutate in r

提问人:TheBoomerang 提问时间:8/16/2022 最后编辑:s__TheBoomerang 更新时间:8/16/2022 访问量:112

问:

我想知道是否有更有效的方法来向 R 中的数据集添加计数。

使用 mpg 数据集,这就是我以 mpg 数据集为例的方式。

mpg %>% 
  group_by(manufacturer) %>% 
  count() %>% 
  right_join(
    mpg
  )

因此,从本质上讲,我想要计算制造商列中唯一观测值的数量。 它工作正常,因为这是一个相当小的数据集,但我正在处理具有超过 100k 个观测值的数据集,并希望找到一种比以这种方式加入更好的方法。

为了提供背景信息,将唯一观测值的数量用作后续分析的分母。

r 计数 计数

评论

4赞 phiver 8/16/2022
mpg %>% group_by(manufacturer) %>% add_tally()

答:

3赞 s__ 8/16/2022 #1

如果你想走得快,你可以试试:data.table

library(data.table) 
res <- data.table(mpg)[,':='(cnt = .N), by = manufacturer]
res
     manufacturer  model displ year cyl      trans drv cty hwy fl   class cnt
  1:         audi     a4   1.8 1999   4   auto(l5)   f  18  29  p compact  18
  2:         audi     a4   1.8 1999   4 manual(m5)   f  21  29  p compact  18
  3:         audi     a4   2.0 2008   4 manual(m6)   f  20  31  p compact  18
  4:         audi     a4   2.0 2008   4   auto(av)   f  21  30  p compact  18
  5:         audi     a4   2.8 1999   6   auto(l5)   f  16  26  p compact  18
 ---                                                                         
230:   volkswagen passat   2.0 2008   4   auto(s6)   f  19  28  p midsize  27
231:   volkswagen passat   2.0 2008   4 manual(m6)   f  21  29  p midsize  27
232:   volkswagen passat   2.8 1999   6   auto(l5)   f  16  26  p midsize  27
233:   volkswagen passat   2.8 1999   6 manual(m5)   f  18  26  p midsize  27
234:   volkswagen passat   3.6 2008   6   auto(s6)   f  17  26  p midsize  27

基准测试(使用@phiver不错的解决方案):

library(dplyr)
library(microbenchmark)

microbenchmark(dplyr      =  mpg %>% group_by(manufacturer) %>% add_tally() ,
               data.table =  data.table(mpg)[,':='(cnt = .N), by = manufacturer])

Unit: milliseconds
       expr      min       lq     mean   median       uq       max neval
      dplyr 8.201807 8.557434 9.599122 9.018660 9.922339 17.425479   100
 data.table 1.245440 1.370666 1.615039 1.470719 1.691733  6.391889   100