Welcome to R Square

找到你最需要的最棒的 R 包

楚新元 / 2023-10-11


寻找满足需求的 R 包

比如我现在需要一个能读取 Excel 文件的 R 包,你可以用 pkgsearch 包帮你搜索一下,比如用关键词 “read excel” 来搜:

library(pkgsearch)
pkg = ps("read excel", size = 20)
DT::datatable(pkg[c(1:2, 4)])

你可以用 View(pkg) 获得更多的信息。

哪一个包最棒?

能满足需求的包可能不止一个,我该选哪一个呢?或许下载量指标是个不错的指标。需要说明的是下载量最大的包不一定就是最棒的包,因为新包由于知名度较低,可能下载量比较低,但是对于老包,这个指标还是很有代表性的。另外下载量最大的包在具体某个功能点上未必就是最好的。

我对包更挑剔点,在能满足要求的前提下,我更喜欢轻量级的包。如果是写 R 包你会发现尽量用 base R 自带的函数更好。

统计相关包的下载量

# 获取 RStudio CRAN mirror 上的下载量数据
library(cranlogs)
packages = c("readxl", "xlsx", "openxlsx", "XLConnect")
data = cran_downloads(
  packages = packages, 
  from = "2020-01-01"
)

# 按照包分组统计总下载量
summary = aggregate(
  data$count, 
  by = list(Package = data$package), 
  FUN = sum
)

下载量走势图更直观

每日下载量

library(echarts4r)
data |> 
  group_by(package) |> 
  e_chart(date) |> 
  e_line(
    serie = count,
    symbol = "circle",
    symbolSize = 1,
    smooth = TRUE,
    emphasis = list(focus = "series")
  ) |> 
  e_y_axis(name = "Downloads") |> 
  e_mark_line(
    data = list(
      type = "average",
      name = "AVG"
    ),
    symbolSize = 0
  ) |> 
  e_tooltip(trigger = "axis") |> 
  e_legend(top = "22%") |> 
  e_grid(bottom = "10%", right = "5%", top = "20%") |> 
  e_title(
    text = "Package Daily Download",
    subtext = paste(
      paste(summary$Package, summary$x, sep = ": "),
      collapse = ", "
    )
  )

累计下载量

data$cumulative = ave(
  data$count, 
  data$package, 
  FUN = cumsum
)

data |> 
  group_by(package) |> 
  e_chart(date) |> 
  e_line(
    serie = cumulative,
    symbol = "circle",
    symbolSize = 1,
    smooth = TRUE,
    emphasis = list(focus = "series")
  ) |> 
  e_tooltip(trigger = "axis") |> 
  e_legend(top = "22%") |> 
  e_grid(bottom = "10%", right = "5%", top = "20%") |> 
  e_title(
    text = "Package Cumulative Download",
    subtext = paste(
      paste(summary$Package, summary$x, sep = ": "),
      collapse = ", "
    )
  )

注:下载量可视化代码部分参考了苏玮的文章Visualize CRAN Package Downloads,动图效果更好点。

一图胜千言,不可否认:仅仅只是读取 Excel 文件,readxl 包确实是目前最棒的包,支持 .xlsx 和 .xls 两种格式,它的底层是基于 C 和 C++,读取速度也非常快。

如果除了读取外,还有其他需求,比如定制个性化的报表,那么 openxlsx2openxlsx 包就非常值得深入学习了。

如果要读取复杂的 Excel 表格数据,比如通过数据透视表生成的数据1,那么 tidyxl 包就很有必要了。


  1. 知乎上张敬信老师写了一篇文章《tidyxl包:复杂Excel表格数据读取(逆透视)》供参考。 ↩︎