備忘ログ

チラシの裏的備忘録&メモ

CRANに登録されているRのパッケージを最も多くメンテナンスしているのはなのか?

今月も何も特に書くことがないので、CRANに登録されているRのパッケージを最も多くメンテナンスしているのはなのかを調べてみた。

CRANに登録されているRのパッケージのDESCRIPTIONのデータを持ってきてくれる{tools}CRAN_package_db()を使うと、{utils}available.packages()よりも多くの情報を得ることができる。

例えばavailabel.packages()では取得できないMaintainer等の情報も得られるので、多くパッケージのMaintainerを務める人を抽出することができる。

Maintainerの名前欄は様々な形式の名前以外の文字があるのでそれを処理するひつようがある。

上位20名を取り出してみる。

library(dplyr)
## 
##  次のパッケージを付け加えます: 'dplyr'

##  以下のオブジェクトは 'package:stats' からマスクされています:
## 
##     filter, lag

##  以下のオブジェクトは 'package:base' からマスクされています:
## 
##     intersect, setdiff, setequal, union
library(stringr)
library(stringi)

package_list <- tools::CRAN_package_db() |> 
  mutate(Maint = stri_trans_general(str_trim(str_match(Maintainer,"^[\'\"]?([^\'\",(<]+).*<")[,2]),"latin-ascii"))

Maint_list <- package_list |> 
  count(Maint) |> 
  arrange(desc(n))

head(Maint_list, 20)
##                  Maint  n
## 1    Dirk Eddelbuettel 68
## 2         Gabor Csardi 66
## 3    Scott Chamberlain 59
## 4     Stephane Laurent 53
## 5       Hadley Wickham 52
## 6          Jeroen Ooms 48
## 7   Robin K. S. Hankin 33
## 8     Henrik Bengtsson 31
## 9         Jan Wijffels 31
## 10     Martin Maechler 29
## 11         Kurt Hornik 28
## 12            Max Kuhn 27
## 13           Bob Rudis 26
## 14     Kartikeya Bolar 26
## 15       Kirill Muller 26
## 16 Shannon T. Holloway 26
## 17       Simon Urbanek 26
## 18     Muhammad Yaseen 25
## 19 Thomas Lin Pedersen 25
## 20     Torsten Hothorn 25

最も多くのパッケージのMaintainerであるDirk Eddelbuettel氏は{Rcpp}パッケージを始めとする複数のパッケージMaintainerをである。

Dirk EddelbuettelがMaintainerの{Rcpp}系(Rcppが名前に含まれているパッケージ)のパッケージだけを取り出したかったら次のようにするとできる。

package_list |> 
  filter(Maint == "Dirk Eddelbuettel") |> 
  select(Package) |> 
  unlist() |> 
  unname() |> 
  str_subset("Rcpp")
##  [1] "Rcpp"                "RcppAnnoy"           "RcppAPT"            
##  [4] "RcppArmadillo"       "RcppBDT"             "RcppCCTZ"           
##  [7] "RcppClassic"         "RcppClassicExamples" "RcppCNPy"           
## [10] "RcppDate"            "RcppDE"              "RcppEigen"          
## [13] "RcppExamples"        "RcppFarmHash"        "RcppFastFloat"      
## [16] "RcppGetconf"         "RcppGSL"             "RcppMsgPack"        
## [19] "RcppNLoptExample"    "RcppQuantuccia"      "RcppRedis"          
## [22] "RcppSimdJson"        "RcppSMC"             "RcppSpdlog"         
## [25] "RcppStreams"         "RcppTOML"            "RcppXts"            
## [28] "RcppZiggurat"

めっちゃRcpp。

パッケージのMaintainerのトータル人数を見る。

package_list |> 
  select(Maint) |> 
  unique() |> 
  nrow()
## [1] 9902

現在約9900人のパッケージMaintainerがいることがわかる。

このうち、大半が上記の上位20位のシリアルパッケージMaintainerのような人ではなく、少数(1~3)のパッケージのMaintainerであると予想できる。

package_list |> 
  count(Maint, name = "packages") |> 
  arrange(desc(packages)) |> 
  count(packages, name = "Maintainer") |> 
  mutate(prop = (Maintainer / sum(Maintainer))) |>
  mutate(prop_sum = cumsum(prop)) |> 
  head(10)
##    packages Maintainer        prop  prop_sum
## 1         1       6593 0.665825086 0.6658251
## 2         2       1667 0.168349828 0.8341749
## 3         3        707 0.071399717 0.9055746
## 4         4        343 0.034639467 0.9402141
## 5         5        172 0.017370228 0.9575843
## 6         6         95 0.009594021 0.9671783
## 7         7         72 0.007271258 0.9744496
## 8         8         53 0.005352454 0.9798021
## 9         9         32 0.003231670 0.9830337
## 10       10         37 0.003736619 0.9867703

propがメンテナー全体からそのパッケージ数のMaintainerの割合で、要するに66.6%(約2/3)が1つのパッケージのみをメンテナンスしている。

3つまででMaintainerの90%を超えるので、4つ以上のパッケージをメンテナンスしてるMaintainerは上位10%なる。

参考文献

blog.revolutionanalytics.com

これをみると、2018年と現在で少しランキングが変わっている様子で、 Scott Chamberlain氏がもっとも多くのパッケージをメンテナンスしていたよう。

年次推移的なのを観てみたかったが、そのためのデータが見つからなかったので残念。