# What are the most popular keywords of CRAN packages?

**The blog of Kun Ren**, and kindly contributed to R-bloggers]. (You can report issue about the content on this page here)

Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.

*(This article is adapted to the latest version of rvest package.)*

A large proportion of R's power should be attributed to the enormous amount of extension packages. Many packages are published to CRAN.

These packages cover a wide range of fields. In this post, I'll show you how to use R to scrap the titles of all CRAN packages from the web page and find out which keywords are the most popular.

To minimize the efforts, we try best to avoid reinventing the wheels and get some answer as quickly as possible. We only use existing packages to do all the work.

Here is our toolbox that is useful in this task:

`rvest`

: Scrape from the web page by selector`rlist`

: Quickly perform mapping and filtering in functional style`pipeR`

: Pipe all operations at high performance

First, we equip our R environment with these tools.

```
library(rvest)
library(rlist)
library(pipeR)
```

Then we download and parse the web page.

```
url <- "http://cran.r-project.org/web/packages/available_packages_by_date.html"
page <- html(url)
```

Now `page`

is a parsed HTML document object that is well structured and is ready to query. Note that we need to get the texts in the third column of the table. Here we use XPath to locate the information we want. Or you can use CSS selector to do the same work.

The following code are written in fluent style with pipeline.

```
words <- page %>>%
html_node("//tr//td[3]//text()", xpath = TRUE) %>>%
# select the 3rd column
list.map( # map each node to ...
# 1. get the trimmed text in the XML node
XML::xmlValue(.) %>>%
# 2. split the text by non-word-letters
strsplit("[^a-zA-Z]") %>>%
# 3. put everything together in vector
unlist(use.names = FALSE) %>>%
# 4. lower all words
tolower %>>%
# 5. filter words with more than 3 letters to be meaningful
list.filter(nchar(.) > 3L)) %>>%
# put everything in a large character vector
unlist %>>%
# create a table of word count
table %>>%
# sort the table descending
sort(decreasing = TRUE) %>>%
# take out the first 100 elements
head(100) %>>%
# print out the results
print
```

```
data analysis models with functions
864 718 484 404 371
package regression estimation model based
336 308 273 249 238
using tools from bayesian linear
235 225 194 173 169
methods time interface multivariate statistical
169 168 160 133 124
test generalized clustering tests series
114 112 105 105 104
inference statistics random distribution selection
101 101 100 97 96
modeling spatial algorithm multiple simulation
89 89 87 87 82
mixed method likelihood distributions modelling
81 78 77 76 73
network sets classification mixture sampling
72 70 68 67 64
effects robust sparse survival variable
63 63 60 60 60
high fitting gene function optimization
58 57 57 56 56
graphical testing networks files nonparametric
55 55 54 52 52
plots sample dimensional genetic multi
52 52 51 51 51
utilities visualization implementation density matrix
51 51 50 49 49
hierarchical lasso learning markov correlation
48 48 48 48 47
dynamic plot prediction censored meta
47 47 47 46 46
datasets gaussian response adaptive association
45 45 45 44 44
binary design least normal system
44 44 43 43 43
fast functional point analyses confidence
42 42 42 41 41
experiments graphics objects population process
41 41 41 41 41
```

The work is done, in 12 lines, in only a little more than 2 seconds!

If you want to know more about these packages, please visit their project pages. Hope you can do more amazing things in your work.

**leave a comment**for the author, please follow the link and comment on their blog:

**The blog of Kun Ren**.

R-bloggers.com offers

**daily e-mail updates**about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.

Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.