93
Similarly, to use our function on a vector with more than one element, we should call it
within the lapply() function as follows:
# reverse vector (by words)
lapply(c("the big bang theory""atmosphere"), reverse_words)
## [[1]]
## [1] "theory bang big the"
##
## [[2]]
## [1] "atmosphere"
7.2 Matching e-mail addresses
The second practical example that we will discuss consists of matching an email address. We
will work with usual email addresses having one (or a similar variant) of the following forms:
somename@email.com
somename99@email.com
some.name@email.com
some.name@an-email.com
some.name@an.email.com
Since our goal is tomatch an email address, this implies thatweneed to dene acorresponding
regex pattern. If we look at the previous email forms it is possible to see that they have a
general structure that can be broken into three parts. The rst part is the username (e.g.
somename99). The second part is an @ symbol. The third part is the domain name (e.g.
an.email.com).
The username pattern can be dened as:
^([a-z0-9_\\.-]+)
The username pattern starts with a caret ^ to indicate the beginning of the string. Then we
have a group indicated with parentheses. It matches one or more lowercase letters, numbers,
underscores, dots, or hyphens.
The domain name pattern can be dened as:
([\\da-z\\.-]+)\\.([a-z\\.]{2,6})$
The domain name should be one or more lowercase letters, numbers, underscores, dots, or
hyphens. Then another (escaped) dot, followed by an extension of two to six letters or dots.
And nally the end of the string ($).
CC BY-NC-SA 3.0 GastonSanchez
Handling and Processing Strings in R
Pdf to powerpoint converter online - application software tool:C# Create PDF from PowerPoint Library to convert pptx, ppt to PDF in C#.net, ASP.NET MVC, WinForms, WPF
Online C# Tutorial for Creating PDF from Microsoft PowerPoint Presentation
www.rasteredge.com
Pdf to powerpoint converter online - application software tool:VB.NET Create PDF from PowerPoint Library to convert pptx, ppt to PDF in vb.net, ASP.NET MVC, WinForms, WPF
VB.NET Tutorial for Export PDF file from Microsoft Office PowerPoint
www.rasteredge.com
94
The complete regular expression pattern (in R) for an email address is:
"^([a-z0-9_\\.-]+)@([\\da-z\\.-]+)\\.([a-z\\.]{2,6})$"
Let’s test our pattern with a minimalist example:
# pattern
email_pat = "^([a-z0-9_nn.-]+)@([nnda-znn.-]+)nn.([a-znn.]f2,6g)$"
# string that matches
grepl(pattern = = email_pat, x x = "gaston@abc.com")
## [1] TRUE
Here is another more real example:
# another string that matches
grep(pattern = email_pat, , x x = "gaston.sanchez@research-center.fr")
## [1] 1
However, if we have a \long" TLD (top-level domain) exceeding six letters, the pattern won’t
match, like in the next example:
# unmatched email (TLD too long)
grep(pattern = email_pat, , x x = "gaston@abc.something")
## integer(0)
Now let’s apply the email pattern to test whether several strings match or not:
# potential email addresses
emails = c(
"simple@example.com",
"johnsmith@email.gov",
"marie.curie@college.edu",
"very.common@example.com",
"a.little.lengthy.but.ok@dept.example.com",
"disposable.style.email.with+symbol@example.com",
"not_good@email.address")
# detect pattern
str_detect(string=emails, pattern=email_pat)
## [1] TRUE TRUE TRUE TRUE TRUE FALSE FALSE
Note that the two last elements in emails are not well dened email addresses (they don’t
match the espicied pattern). The fth address contains ve sets of strings including a
CC BY-NC-SA 3.0 GastonSanchez
Handling and Processing Strings in R
application software tool:Online Convert PowerPoint to PDF file. Best free online export
Online Powerpoint to PDF Converter. Download Free Trial. Convert a PPTX/PPT File to PDF. Just upload your file by clicking on the blue
www.rasteredge.com
application software tool:XDoc.Converter for .NET, Support Documents and Images Conversion
Convert PowerPoint to ODP. Convert to Tiff. Convert Word, Excel and PDF to image. Next Steps. Download and try Converter for .NET with online support. See Pricing
www.rasteredge.com
95
+ symbol. In turn, the sixth address has a long domain name (email.address) in which
address exceeds six letters.
7.3 Matching HTML elements
For our third example we will deal with some basic handling of HTML tags. We’ll take the
webpage for the R mailing lists:http://www.r-project.org/mail.html
If you visit the previous webpage you will see that there are four general mailing lists devoted
to R:
 R-announce is where major announcements about the development of R and the
availability of new code.
 R-packages is a list of announcements on the availability of new or enhanced con-
tributed packages
 R-help is the main R mailing list for discussion about problems and solutions using R
 R-devel is a list intended for questions and discussion about code development in R
Additionally, there are several specic Special Interest Group (SIG) mailing lists. The
following table shows the rst 5 groups:
First 5 Special Interest Groups (SIG) in R
Name
Description
R-SIG-Mac
Special Interest Group on Mac ports of R
R-sig-DB
SIG on Database Interfaces
R-SIG-Debian
Special Interest Group for Debian ports of R
R-sig-dynamic-models Special Interest Group for Dynamic Simulation Models
R-sig-Epi
Rfor epidemiological data analysis
As a simple example, suppose we wanted to get the href attributes of all the SIG links. For
instance, the href attribute of the R-SIG-Mac link is:
https://stat.ethz.ch/mailman/listinfo/r-sig-mac
In turn the href attribute of the R-sig-DB link is:
https://stat.ethz.ch/mailman/listinfo/r-sig-db
If we take a peek at the html source-code of the webpage, we’ll see that all the links can be
found on lines like this one:
CC BY-NC-SA 3.0 GastonSanchez
Handling and Processing Strings in R
application software tool:C#: How to Use SDK to Convert Document and Image Using XDoc.
You may use our converter SDK to easily convert PDF, Word, Excel, PowerPoint, Tiff, and Dicom files to raster images like Jpeg, Png, Bmp and Gif.
www.rasteredge.com
application software tool:RasterEdge XDoc.PowerPoint for .NET - SDK for PowerPoint Document
Add image to specified position on PowerPoint page. Next Steps. Download Free Trial Download and try PDF for .NET with online support. See Pricing
www.rasteredge.com
96
<td><a href="https://stat.ethz.ch/mailman/listinfo/r-sig-mac">
<tt>R-SIG-Mac</tt></a></td>
7.3.1 Getting SIG links
The rst step is to create avector ofcharacter strings that will contain the lines ofthe mailing
lists webpage. We can create this vector by simply passing the URL name to readLines():
# read html content
mail_lists = readLines("http://www.r-project.org/mail.html")
Once we’ve read the HTML content of the R mailing lists webpage, the next step is to dene
our regex pattern that matches the SIG links.
^.*<td> *<a href="(https.*)">.*$
Let’s examine the proposed pattern. By using the caret (^) and dollar sign ($) we can
describe our pattern as an entire line. Next to the caret we match anything zero or more
times followed by a <td> tag. Then there is a blank space matched zero or more times,
followed by an anchor tag with its href attribute. Note that we are using double quotation
marks to match the href attribute ("(https.*)"). Moreover, the entire regex pattern is
surrounded by single quotations marks    . Here is how we can get the SIG links:
# SIG s href pattern
sig_pattern =  ^.*<td> *<a a href="(https.*)">.*$
# find SIG href attributes
sig_hrefs = grep(sig_pattern, mail_lists, value = TRUE)
# let s see first 5 elements (shorten output)
shorten_sigs = rep("", 5)
for (i in n 1:5) ) f
shorten_sigs[i] = toString(sig_hrefs[i], width=70)
g
shorten_sigs
## [1] "
<td><a href=\"https://stat.ethz.ch/mailman/listinfo/r-sig-mac\">...."
## [2] "
<td><a href=\"https://stat.ethz.ch/mailman/listinfo/r-sig-db\"><...."
## [3] "
<td><a href=\"https://stat.ethz.ch/mailman/listinfo/r-sig-debia...."
## [4] "
<td><a href=\"https://stat.ethz.ch/mailman/listinfo/r-sig-dynam...."
## [5] "
<td><a href=\"https://stat.ethz.ch/mailman/listinfo/r-sig-epi\">...."
We need to get rid of the extra html tags. We can easily extract the names of the note les
using the sub() function (since there is only one link per line, we don’t need to use gsub(),
CC BY-NC-SA 3.0 GastonSanchez
Handling and Processing Strings in R
application software tool:VB.NET PDF - Convert PDF Online with VB.NET HTML5 PDF Viewer
All Formats. XDoc.HTML5 Viewer. XDoc.Windows Viewer. XDoc.Converter. View & Process. Adobe PDF. XDoc.PDF. Scanning. XDoc.Word. XDoc.Excel. XDoc.PowerPoint. Barcoding
www.rasteredge.com
application software tool:VB.NET PDF- View PDF Online with VB.NET HTML5 PDF Viewer
All Formats. XDoc.HTML5 Viewer. XDoc.Windows Viewer. XDoc.Converter. View & Process. Adobe PDF. XDoc.PDF. Scanning. XDoc.Word. XDoc.Excel. XDoc.PowerPoint. Barcoding
www.rasteredge.com
97
although we could).
# get first matched group
sub(sig_pattern, "nn1", sig_hrefs)
## [1] "https://stat.ethz.ch/mailman/listinfo/r-sig-mac"
## [2] "https://stat.ethz.ch/mailman/listinfo/r-sig-db"
## [3] "https://stat.ethz.ch/mailman/listinfo/r-sig-debian"
## [4] "https://stat.ethz.ch/mailman/listinfo/r-sig-dynamic-models"
## [5] "https://stat.ethz.ch/mailman/listinfo/r-sig-epi"
## [6] "https://stat.ethz.ch/mailman/listinfo/r-sig-ecology"
## [7] "https://stat.ethz.ch/mailman/listinfo/r-sig-fedora"
## [8] "https://stat.ethz.ch/mailman/listinfo/r-sig-finance"
## [9] "https://stat.ethz.ch/mailman/listinfo/r-sig-geo"
## [10] "https://stat.ethz.ch/mailman/listinfo/r-sig-gr"
## [11] "https://stat.ethz.ch/mailman/listinfo/r-sig-gui"
## [12] "https://stat.ethz.ch/mailman/listinfo/r-sig-hpc"
## [13] "https://stat.ethz.ch/mailman/listinfo/r-sig-jobs"
## [14] "https://stat.ethz.ch/mailman/listinfo/r-sig-mixed-models"
## [15] "https://stat.ethz.ch/mailman/listinfo/r-sig-mediawiki"
## [16] "https://stat.ethz.ch/mailman/listinfo/r-sig-networks"
## [17] "https://stat.ethz.ch/mailman/listinfo/r-sig-phylo"
## [18] "https://stat.ethz.ch/mailman/listinfo/r-sig-qa"
## [19] "https://stat.ethz.ch/mailman/listinfo/r-sig-robust"
## [20] "https://stat.ethz.ch/mailman/listinfo/r-sig-s"
## [21] "https://stat.ethz.ch/mailman/listinfo/r-sig-teaching"
## [22] "https://stat.ethz.ch/mailman/listinfo/r-sig-wiki"
As you can see, we are using the regex pattern nn1 in the sub() function. Generally speaking
nnN is replaced with the N-th group specied in the regular expression. The rst matched
group is referenced by nn1. In our example, the rst group is everything that is contained in
the curved brackets, that is: (https.*), which are in fact the links we are looking for.
7.4 Text Analysis of BioMed Central Journals
For our last application we will work analyzing some text data. We will analyze the catalog
of journals from the BioMed Central (BMC), a scientic publisher that specializes in
open access journal publication. You can nd more informaiton of BMC at: http://www.
biomedcentral.com/about/catalog
The datawith the journal catalogis availablein csv format at:http://www.biomedcentral.
com/journals/biomedcentraljournallist.txt
CC BY-NC-SA 3.0 GastonSanchez
Handling and Processing Strings in R
application software tool:C# HTML5 PDF Viewer SDK to convert and export PDF document to
All Formats. XDoc.HTML5 Viewer. XDoc.Windows Viewer. XDoc.Converter. View & Process. Adobe PDF. XDoc.PDF. Scanning. XDoc.Word. XDoc.Excel. XDoc.PowerPoint. Barcoding
www.rasteredge.com
application software tool:DocImage SDK for .NET: Web Document Image Viewer Online Demo
Try Online Demo Now. Please click Browse to upload a file to display in web viewer. Suppported files are Word, Excel, PowerPoint, PDF, Tiff, Dicom and main
www.rasteredge.com
98
To import the data in R we can read the le with read.table(). Just specify the URL
location of the le and pass it to read.table(). Don’t forget to set the arguments sep =
"," and stringsAsFactors = FALSE
# link of data set
url = "http://www.biomedcentral.com/journals/biomedcentraljournallist.txt"
# read data (stringsAsFactors=FALSE)
biomed = read.table(url, header = TRUE, sep = ",", stringsAsFactors = FALSE)
We can check the structure of the data with the function str():
# structure of the dataset
str(biomed, vec.len n = = 1)
##  data.frame : 336 obs. of 7 variables:
## $ Publisher
: chr "BioMed Central Ltd" ...
## $ Journal.name : chr "AIDS Research and Therapy" ...
## $ Abbreviation : chr "AIDS Res Ther" ...
## $ ISSN
: chr "1742-6405" ...
## $ URL
: chr "http://www.aidsrestherapy.com" ...
## $ Start.Date
: int 2004 2011 ...
## $ Citation.Style: chr "BIOMEDCENTRAL" ...
As you can see, the data frame biomed has 336 observations and 7 variables. Actually, all
the variables except for Start.Date are in character mode.
7.4.1 Analyzing Journal Names
We will do a simple analysis of the journal names. The goal is to study what are the more
common terms used in the title of the journals. We are going to keep things at a basic
level but for a more formal (and sophisticated) analysis you can check the package tm |text
mining| (by Ingo Feinerer).
To have a better idea of what the data looks like, let’s check the rst journal names.
# first 5 journal names
head(biomed$Journal.name, 5)
## [1] "AIDS Research and Therapy"
## [2] "AMB Express"
## [3] "Acta Neuropathologica Communications"
## [4] "Acta Veterinaria Scandinavica"
## [5] "Addiction Science & Clinical Practice"
CC BY-NC-SA 3.0 GastonSanchez
Handling and Processing Strings in R
99
As you can tell, the fth journal "Addiction Science & Clinical Practice" has an am-
persand & symbol. Whether to keep the ampersand and other punctutation symbols depends
on the objectives of the analysis. In our case, we will remove those elements.
Preprocessing
The preprocessing steps implies to get rid of the punctuation symbols. For convenient reasons
it is always recommended to start working with a small subset of the data. In this way we
can experiment at a small scale until we are condent with the right manipulations. Let’s
take the rst 10 journals:
# get first 10 names
titles10 = biomed$Journal.name[1:10]
titles10
## [1] "AIDS Research and Therapy"
## [2] "AMB Express"
## [3] "Acta Neuropathologica Communications"
## [4] "Acta Veterinaria Scandinavica"
## [5] "Addiction Science & Clinical Practice"
## [6] "Agriculture & Food Security"
## [7] "Algorithms for Molecular Biology"
## [8] "Allergy, Asthma & Clinical Immunology"
## [9] "Alzheimer s Research & Therapy"
## [10] "Animal Biotelemetry"
We want to get rid of the ampersand signs &, as well as other punctuation marks. This can be
done with str
replace
all() and replacing the pattern [[:punct:]] with empty strings
"" (don’t forget to load the stringr package)
# remove punctuation
titles10 = str_replace_all(titles10, pattern = "[[:punct:]]""")
titles10
## [1] "AIDS Research and Therapy"
## [2] "AMB Express"
## [3] "Acta Neuropathologica Communications"
## [4] "Acta Veterinaria Scandinavica"
## [5] "Addiction Science Clinical Practice"
## [6] "Agriculture Food Security"
## [7] "Algorithms for Molecular Biology"
## [8] "Allergy Asthma Clinical Immunology"
## [9] "Alzheimers Research Therapy"
CC BY-NC-SA 3.0 GastonSanchez
Handling and Processing Strings in R
100
## [10] "Animal Biotelemetry"
We succesfully replaced the punctuation symbols with empty strings, but now we have extra
whitespaces. To remove the whitespaces we will use again str
replace
all() to replace any
one or more whitespaces nns+ with a single blank space " ".
# trim extra whitespaces
titles10 = str_replace_all(titles10, pattern = "nns+"" ")
titles10
## [1] "AIDS Research and Therapy"
## [2] "AMB Express"
## [3] "Acta Neuropathologica Communications"
## [4] "Acta Veterinaria Scandinavica"
## [5] "Addiction Science Clinical Practice"
## [6] "Agriculture Food Security"
## [7] "Algorithms for Molecular Biology"
## [8] "Allergy Asthma Clinical Immunology"
## [9] "Alzheimers Research Therapy"
## [10] "Animal Biotelemetry"
Once we have a better idea of how to preprocess the journal names, we can proceed with all
the 336 titles.
# remove punctuation symbols
all_titles = str_replace_all(biomed$Journal.name, pattern = "[[:punct:]]""")
# trim extra whitespaces
all_titles = str_replace_all(all_titles, pattern = "nns+"" ")
The next step is to split up the titles into its dierent terms (the output is a list).
# split titles by words
all_titles_list = str_split(all_titles, pattern = " ")
# show first 2 elements
all_titles_list[1:2]
## [[1]]
## [1] "AIDS"
"Research" "and"
"Therapy"
##
## [[2]]
## [1] "AMB"
"Express"
CC BY-NC-SA 3.0 GastonSanchez
Handling and Processing Strings in R
101
Summary statistics
So far we have a list that contains the words ofeach journal name. Wouldn’t be interesting to
know more about the distribution of the number of terms in each title? This means that we
need to calculate how many words are in each title. To get these numbers let’s use length()
within sapply(); and then let’s tabulate the obtained frequencies:
# how many words per title
words_per_title = sapply(all_titles_list, length)
# table of frequencies
table(words_per_title)
## words_per_title
##
1
2
3
4
5
6
7
8
9
## 17 108 81 55 33 31
6
4
1
We can also express the distribution as percentages, and we can get some summary statistics
with summary()
# distribution
100 * round(table(words_per_title)/length(words_per_title), 4)
## words_per_title
##
1
2
3
4
5
6
7
8
9
## 5.06 32.14 24.11 16.37 9.82 9.23 1.79 1.19 0.30
# summary
summary(words_per_title)
##
Min. 1st Qu. Median
Mean 3rd Qu.
Max.
##
1.00
2.00
3.00
3.36
4.00
9.00
Looking at summary statistics we can say that around 30% of journal names have 2 words.
Likewise, the median number of words per title is 3 words.
Interestingly the maximum value is 9 words. What is the journal with 9 terms in its title?
We can nd the longest journal name as follows:
# longest journal
all_titles[which(words_per_title == 9)]
## [1] "Journal of Venomous Animals and Toxins including Tropical Diseases"
CC BY-NC-SA 3.0 GastonSanchez
Handling and Processing Strings in R
102
7.4.2 Common words
Remember that our main goal with this example is to nd out what words are the most
common in the journal titles. To answer this question we rst need to create something like
adictionary of words. How do get such dictionary? Easy, we just have to obtain a vector
containing all the words in the titles:
# vector of words in titles
title_words = unlist(all_titles_list)
# get unique words
unique_words = unique(title_words)
# how many unique words in total
num_unique_words = length(unique(title_words))
num_unique_words
## [1] 441
Applying unique() to the vector title
words we get the desired dictionary of terms, which
has a total of 441 words.
Once we have the unique words, we need to count how many times each of them appears in
the titles. Here’s a way to do that:
# vector to store counts
count_words = rep(0, num_unique_words)
# count number of occurrences
for (i in n 1:num_unique_words) ) f
count_words[i] = sum(title_words == unique_words[i])
g
An alternative simpler way to count the number of word occurrences is by using the table()
function on title
words:
# table with word frequencies
count_words_alt = table(title_words)
In any of both cases (count
words or count
words
alt), we can examine the obtained fre-
quencies with a simple table:
# table of frequencies
table(count_words)
## count_words
CC BY-NC-SA 3.0 GastonSanchez
Handling and Processing Strings in R
Documents you may be interested
Documents you may be interested