Handling and Processing Strings in R
Gaston Sanchez
www.gastonsanchez.com
ThisworkislicensedunderaCreativeCommonsAttribution-NonCommercial-ShareAlike3.0Unported
License (CC BY-NC-SA 3.0) http://creativecommons.org/licenses/by-nc-sa/3.0/ In short:
GastonSanchezretainstheCopyrightbutyouarefreetoreproduce,reblog,remixandmodifythe
contentonlyunderthesamelicensetothisone. Youmaynotusethisworkforcommercialpurposes
butpermissiontousethismaterialinnonprotteachingisstillgranted,providedtheauthorship
andlicensinginformationhereisdisplayed.
Pdf to ppt converter online for large - control application platform: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 ppt converter online for large - control application platform: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
control application platform:VB.NET PowerPoint: Sort and Reorder PowerPoint Slides by Using VB.
Thus, we still offer the precise online guide for a large amount of robust PPT slides/pages provide powerful & profession imaging controls, PDF document, image
www.rasteredge.com
control application platform:C# TIFF: TIFF Editor SDK to Read & Manipulate TIFF File Using C#.
Handle large size of Tiff in partition, reducing the resource 2. Word/Excel/PPT/PDF/ Jpeg to Tiff conversion. Refer to this online tutorial page, you will see:
www.rasteredge.com
About this ebook
Abstract
ThisebookaimstohelpyougetstartedwithmanipulatingstringsinR.Althoughthereare
afewissueswithRaboutstringprocessing,someofusarguethatRcanbeverywellused
forcomputingwithcharacterstringsandtext. R maynotbeas richanddiverseas other
scriptinglanguageswhenitcomestostringmanipulation,butitcantakeyouveryfarifyou
knowhow. Hopefullythistextwillprovideyouenoughmaterialtodomoreadvancedstring
andtextprocessingoperations.
Aboutthereader
Iamassumingthreethingsaboutyou. Indecreasingorderofimportance:
1. YoualreadyknowR|thisisnotanintroductorytextonR|.
2. YoualreadyuseRforhandlingquantitativeandqualitativedata,butnot(necessarily)
forprocessingstrings.
3. YouhavesomebasicknowledgeaboutRegularExpressions.
License
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0
Unportedlicense: http://creativecommons.org/licenses/by-nc-sa/3.0/
Citation
Youcancitethisworkas:
Sanchez,G.(2013)HandlingandProcessingStringsinR
TrowchezEditions. Berkeley,2013.
http://www.gastonsanchez.com/Handling
and
Processing
Strings
in
R.pdf
Revision
Version1.3(March,2014)
i
control application platform:VB.NET Excel: Render and Convert Excel File to TIFF Image by Using
If you need the most comprehensive overview on VB.NET Excel converter add-on, please go If you want to view or edit PDF, Word, Excel or PPT document, you
www.rasteredge.com
control application platform:C# Imaging - Decode Identcode in C#.NET
Own advanced Identcode barcode reading functionality for C# PDF,Word, Excel & PPT editing projects. decode is located at one corner of a large-size image
www.rasteredge.com
Contents
Preface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . iii
1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
1.1 SomeResources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
1.2 CharacterStringsandDataAnalysis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2
1.3 AToyExample . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3
1.4 Overview. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10
2 CharacterStringsinR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.1 CreatingCharacterStrings. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
11
2.1.1 Emptystring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
12
2.1.2 Emptycharactervector. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
12
2.1.3 character() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13
2.1.4 is.character()andas.character() . . . . . . . . . . . . . . . . . . . . . . . . . . .
14
2.2 StringsandRobjects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15
2.2.1 BehaviorofRobjectswithcharacterstrings . . . . . . . . . . . . . . . . . . . . .
15
2.3 GettingTextintoR. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
17
2.3.1 Readingtables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
18
2.3.2 Readingrawtext . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
19
3 StringManipulations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.1 Theversatilepaste()function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
23
3.2 Printingcharacters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
25
3.2.1 Printingvalueswithprint() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
25
3.2.2 Unquotedcharacterswithnoquote() . . . . . . . . . . . . . . . . . . . . . . . . . . . .
26
3.2.3 Concatenateandprintwithcat() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
26
3.2.4 Encodingstringswithformat() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
28
3.2.5 C-stylestringformattingwithsprintf(). . . . . . . . . . . . . . . . . . . . . . . . .
30
3.2.6 ConvertingobjectstostringswithtoString(). . . . . . . . . . . . . . . . . . . . .
31
3.2.7 Comparingprintingmethods. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
32
3.3 BasicStringManipulations. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
33
3.3.1 Countnumberofcharacterswithnchar() . . . . . . . . . . . . . . . . . . . . . . .
33
3.3.2 Converttolowercasewithtolower() . . . . . . . . . . . . . . . . . . . . . . . . . . .
34
ii
control application platform:C# Imaging - Scan 1D POSTNET in C#.NET
C#.NET PDF document SDK. Seamlessly integrated with C#.NET MS Word, Excel and PPT documents SDK. Quickly scan POSTENT barcode from images in high-quality. Large
www.rasteredge.com
3.3.3 Converttouppercasewithtoupper() . . . . . . . . . . . . . . . . . . . . . . . . . . .
34
3.3.4 Upperorlowercaseconversionwithcasefold() . . . . . . . . . . . . . . . . .
34
3.3.5 Charactertranslationwithchartr() . . . . . . . . . . . . . . . . . . . . . . . . . . . .
35
3.3.6 Abbreviatestringswithabbreviate() . . . . . . . . . . . . . . . . . . . . . . . . . . .
36
3.3.7 Replacesubstringswithsubstr(). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
36
3.3.8 Replacesubstringswithsubstring(). . . . . . . . . . . . . . . . . . . . . . . . . . . .
37
3.4 SetOperations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
38
3.4.1 Setunionwithunion() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
39
3.4.2 Setintersectionwithintersect() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
39
3.4.3 Setdierencewithsetdiff() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
39
3.4.4 Setequalitywithsetequal() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
40
3.4.5 Exactequalitywithidentical() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
40
3.4.6 Elementcontainedwithis.element() . . . . . . . . . . . . . . . . . . . . . . . . . . .
41
3.4.7 Sortingwithsort() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
41
3.4.8 Repetitionwithrep() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
42
4 Stringmanipulationswithstringr . . . . . . . . . . . . . . . . . . . . . . . . . . 43
4.1 Packagestringr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
44
4.2 BasicStringOperations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
45
4.2.1 Concatenatingwithstr
c() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
45
4.2.2 Numberofcharacterswithstr
length(). . . . . . . . . . . . . . . . . . . . . . . . .
46
4.2.3 Substringwithstr
sub() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
47
4.2.4 Duplicationwithstr
dup() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
49
4.2.5 Paddingwithstr
pad() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
50
4.2.6 Wrappingwithstr
wrap() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
50
4.2.7 Trimmingwithstr
trim() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
52
4.2.8 Wordextractionwithword() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
52
5 RegularExpressions(partI) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
5.1 RegexBasics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
56
5.2 RegularExpressionsinR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
57
5.2.1 RegexsyntaxdetailsinR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
57
5.2.2 Metacharacters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
58
5.2.3 Sequences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
61
5.2.4 CharacterClasses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
63
5.2.5 POSIXCharacterClasses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
65
5.2.6 Quantiers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
66
5.3 FunctionsforRegularExpressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
68
5.3.1 MainRegexfunctions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
68
5.3.2 Regexfunctionsinstringr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
69
5.3.3 Complementarymatchingfunctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
70
5.3.4 Accessoryfunctionsacceptingregexpatterns . . . . . . . . . . . . . . . . . . . . .
70
iv
6 RegularExpressions(partII) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
6.1 PatternFindingFunctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
71
6.1.1 Functiongrep() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
72
6.1.2 Functiongrepl(). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
73
6.1.3 Functionregexpr() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
73
6.1.4 Functiongregexpr(). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
74
6.1.5 Functionregexec() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
75
6.2 PatternReplacementFunctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
76
6.2.1 Replacingrstoccurrencewithsub(). . . . . . . . . . . . . . . . . . . . . . . . . . . .
77
6.2.2 Replacingalloccurrenceswithgsub() . . . . . . . . . . . . . . . . . . . . . . . . . . .
77
6.3 SplittingCharacterVectors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
78
6.4 Functionsinstringr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
79
6.4.1 Detectingpatternswithstr
detect() . . . . . . . . . . . . . . . . . . . . . . . . . . .
79
6.4.2 Extractrstmatchwithstr
extract() . . . . . . . . . . . . . . . . . . . . . . . . .
80
6.4.3 Extractallmatcheswithstr
extract
all() . . . . . . . . . . . . . . . . . . . . .
81
6.4.4 Extractrstmatchgroupwithstr
match() . . . . . . . . . . . . . . . . . . . . . .
81
6.4.5 Extractallmatchedgroupswithstr
match
all(). . . . . . . . . . . . . . . . .
82
6.4.6 Locaterstmatchwithstr
locate() . . . . . . . . . . . . . . . . . . . . . . . . . . .
83
6.4.7 Locateallmatcheswithstr
locate
all(). . . . . . . . . . . . . . . . . . . . . . .
84
6.4.8 Replacerstmatchwithstr
replace() . . . . . . . . . . . . . . . . . . . . . . . . .
84
6.4.9 Replaceallmatcheswithstr
replace
all() . . . . . . . . . . . . . . . . . . . . .
85
6.4.10 Stringsplittingwithstr
split() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
86
6.4.11 Stringsplittingwithstr
split
fixed() . . . . . . . . . . . . . . . . . . . . . . . . .
88
7 PracticalApplications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
7.1 Reversingastring. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
89
7.1.1 Reversingastringbycharacters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
90
7.1.2 Reversingastringbywords . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
92
7.2 Matchinge-mailaddresses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
93
7.3 MatchingHTMLelements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
95
7.3.1 GettingSIGlinks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
96
7.4 TextAnalysisofBioMedCentralJournals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
97
7.4.1 AnalyzingJournalNames . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
98
7.4.2 Commonwords . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
CCBY-NC-SA3.0 GastonSanchez
HandlingandProcessingStringsinR
Preface
Ifyouhavebeenformedandtrainedin\classicalstatistics"(asIwas), Ibetyouprobably
don’t think ofcharacter strings as data that can be analyzed. Thebottom line for your
analysis is numbers orthingsthat can bemappedtonumeric values. Text and character
strings? Really? Areyoukiddingme? ... That’swhatIusedtothinkrightafternishing
college. During my undergraduate studies in statistics, noneof my professors mentioned
analysisapplicationswithstringsandtextdata. Itwasyearslater, ingradschool,whenI
gotthechancetobemarginallyinvolvedwithsomestatisticaltextanalysis.
Perhapsevenworseisthenotsouncommonbelievethatstringmanipulationisasecondary
non-relevanttask. Peoplewillbeimpressedandwilladmireyouforanykindoffancymodel,
sophisticatedalgorithms,andblack-boxmethodsthatyougettoapply. Everybodylovesthe
hautecuisineofdataanalysisandthetopnotchanalytics. Butwhenitcomestoprocessing
andmanipulatingstrings,manywillthinkofitaswashingthedishesorpealingandcutting
potatos. Ifyouwanttobeperceivedasadatachef,youmaybetemptedtothinkthatyou
shouldn’twasteyourtimeinthoseboringtasksofmanipulatingstrings. Yes,itistruethat
youwon’tgetaMichelinstarforprocessingcharacterdata. Butyouwouldhardlybecome
a gooddatacook ifyoudon’tget yourhands dirtywithstring manipulation. Andtobe
honest, it’snotalwaysthatboring. Whetheryoulike it or not, nooneshouldever claim
tobeadataanalystuntilheorshehasdonestringmanipulation. Youdon’thavetobean
expertorsomestringprocessinghacker though. Butyoudoneedtoknow thebasicsand
haveanideaonhowtoproceedincaseyouneedtoplaywithtext-character-stringdata.
Documentation on how to manipulate strings and text data in R is very scarce. This is
mostly because R is not perceived as a scripting language (like Python or Java, among
others). However,Iseriouslythinkthatweneedtohavemoreavailableresourcesaboutthis
indispensabletopic. Thisworkismytwocentsinthislargelyforgottenarea.
GastonSanchez
Nantes,France
September2013
v
vi
CCBY-NC-SA3.0 GastonSanchez
HandlingandProcessingStringsinR
Chapter 1
Introduction
Handling and processing text strings in R? Wait a second ... you exclaim, R is not a
scripting languagelike Perl,Python,orRuby. WhywouldyouwanttouseRforhandling
andprocessingtext? Well,becausesoonerorlater(Iwouldsaysoonerthanlater)youwill
havetodealwithsomekindofstringmanipulationforyourdataanalysis. Soit’sbetterto
bepreparedforsuchtasksandknowhowtoperformtheminsidetheRenvironment.
I’msuretherewillbepeopletellingyouthatthefactthat you candosomethinginR does
notmeanthatyou shoulddoit. AndIagree(tosomeextent). Yes,youprobablyshouldn’t
useRforthosetasksthatcanbebetterperformedwithlanguageslikePython,PerlorRuby.
However,therewillbemanyoccasionsinwhichit’sbettertostayinsidetheRenvironment
(evenifitisjustforconvenientreasonsorforprocrastinationwithinR).Imaydenitelyuse
PythonifIhaveto,butwheneverpossible,IwilltrytostaywithR(mypersonaltaste).
1.1 Some Resources
Thereisnotmuchdocumentationonhowtomanipulatecharacterstringsandtextdatain
R. There are great R books for an enormous variety of statistical methods, graphics and
datavisualization,aswellasapplicationsinawiderangeofeldssuchasecology,genetics,
psychology,nance,economics,etc. Butnotformanipulatingstringsandtextdata.
PerhapsthemainreasonforthislackofresourcesisthatRisnotconsideredtobequalied
as a\scripting"language: R is primarily perceivedas alanguageforcomputingand pro-
grammingwith(mostlynumeric)data. QuotingHadleyWickham(2010)http://journal.
r-project.org/archive/2010-2/RJournal_2010-2_Wickham.pdf
\Rprovidesasolidset ofstringoperations,butbecausetheyhavegrownorganically
over time,theycanbe inconsistentandalittlehardtolearn. Additionally,theylag
1
2
behindthestringoperationsinotherprogramminglanguages,sothatsomethingsthat
areeasytodoinlanguageslikeRubyorPythonareratherhardtodoinR"
MostintroductorybooksaboutRhavesmallsectionsthatbrie ycoverstringmanipulation
withoutgoingfurtherdown. ThatiswhyIdon’thavemanybooksforrecommendation,if
anythingthebookbyPhilSpectorDataManipulationwithR.
Ifpublishedmaterialisnotabundant,westillhavetheonlineworld. Thegoodnewsisthat
thewebisfullofhundredsofreferencesaboutprocessingcharacterstrings. Thebadnewsis
thattheyareveryspreadanduncategorized.
Forspecictopicsandtasks,agoodplacetostartwithisStackOver ow. Thisisaquestions-
and-answerssiteforprogrammersthathasalotofquestionsrelatedwithR.Justlookforthose
questionstaggedwith"r": http://stackoverflow.com/questions/tagged/r. Thereisa
goodnumberofpostsrelatedwithhandlingcharactersandtext,andtheycangiveyouahint
onhowtosolveaparticularproblem. Thereis alsoR-bloggers,http://www.r-bloggers.
com,ablogaggregatorforRenthusiastsinwhichisalsopossibletondcontributedmaterial
aboutprocessingstringsaswellastextdataanalysis.
Youcanalsocheckthefollowingresourcesthathavetodowithstringmanipulations. Itisa
veryshortlistofresourcesbutI’vefoundthemveryuseful:
 RWikibook: ProgrammingandTextProcessing
http://en.wikibooks.org/wiki/R_Programming/Text_Processing
Rwikibookhasasectiondedicatedtotextprocessingthatisworthcheckitout.
 stringr: modern,consistingstringprocessingbyHadleyWickham
http://journal.r-project.org/archive/2010-2/RJournal_2010-2_Wickham.pdf
ArticlefromtheRjournalintroducingthepackagestringrbyHadleyWickham.
 IntroductiontoStringMatchingandModicationinRUsingRegularExpressionsbySvetlana
Eden
http://biostat.mc.vanderbilt.edu/wiki/pub/Main/SvetlanaEdenRFiles/
regExprTalk.pdf
1.2 Character Strings and Data Analysis
ThisbookaimstohelpyougetstartedwithhandlingstringsinR.Itprovidesanoverviewof
severalresourcesthatyoucanuseforstringmanipulation. Itcoversusefulfunctions,general
topics,commonoperations,andothertricks.
Thisbook isNOTabouttextualdataanalysis, linguisticanalysis, textmining, ornatural
language processing. For those purposes, Ihighly recommend you to take a look at the
CCBY-NC-SA3.0 GastonSanchez
HandlingandProcessingStringsinR
Documents you may be interested
Documents you may be interested