Search icon CANCEL
Arrow left icon
Explore Products
Best Sellers
New Releases
Books
Videos
Audiobooks
Learning Hub
Conferences
Free Learning
Arrow right icon
Arrow up icon
GO TO TOP
Data Analysis with R, Second Edition

You're reading from   Data Analysis with R, Second Edition A comprehensive guide to manipulating, analyzing, and visualizing data in R

Arrow left icon
Product type Paperback
Published in Mar 2018
Publisher Packt
ISBN-13 9781788393720
Length 570 pages
Edition 2nd Edition
Languages
Tools
Arrow right icon
Author (1):
Arrow left icon
Tony Fischetti Tony Fischetti
Author Profile Icon Tony Fischetti
Tony Fischetti
Arrow right icon
View More author details
Toc

Table of Contents (19) Chapters Close

Preface 1. RefresheR 2. The Shape of Data FREE CHAPTER 3. Describing Relationships 4. Probability 5. Using Data To Reason About The World 6. Testing Hypotheses 7. Bayesian Methods 8. The Bootstrap 9. Predicting Continuous Variables 10. Predicting Categorical Variables 11. Predicting Changes with Time 12. Sources of Data 13. Dealing with Missing Data 14. Dealing with Messy Data 15. Dealing with Large Data 16. Working with Popular R Packages 17. Reproducibility and Best Practices 18. Other Books You May Enjoy

Navigating the basics

In the interactive R interpreter, any line starting with a > character denotes R asking for input. (If you see a + prompt, it means that you didn't finish typing a statement at the prompt and R is asking you to provide the rest of the expression). Striking the return key will send your input to R to be evaluated. R's response is then spit back at you in the line immediately following your input, after which R asks for more input. This is called a REPL (Read-Evaluate-Print-Loop). It is also possible for R to read a batch of commands saved in a file (unsurprisingly called batch mode), but we'll be using the interactive mode for most of the book.

As you might imagine, R supports all the familiar mathematical operators as with most other languages.

Arithmetic and assignment

Check out the following example:

  > 2 + 2 
  [1] 4 
 
  > 9 / 3 
  [1] 3 
 
  > 5 %% 2    # modulus operator (remainder of 5 divided by 2) 
  [1] 1 

Anything that occurs after the octothorpe or pound sign, #, (or hash-tag for you young'uns), is ignored by the R interpreter. This is useful to document the code in natural language. These are called comments.

In a multi-operation arithmetic expression, R will follow the standard order of operations from math. In order to override this natural order, you have to use parentheses flanking the sub-expression that you'd like to be performed first:

   > 3 + 2 - 10 ^ 2        # ^ is the exponent operator 
   [1] -95 
   > 3 + (2 - 10) ^ 2 
   [1] 67 

In practice, almost all compound expressions are split up with intermediate values assigned to variables that, when used in future expressions, are just like substituting the variable with the value that was assigned to it. The (primary) assignment operator is <-:

   > # assignments follow the form VARIABLE <- VALUE 
   > var <- 10 
   > var 
   [1] 10 
   > var ^ 2 
   [1] 100 
   > VAR / 2             # variable names are case-sensitive  
   Error: object 'VAR' not found 

Notice that the first and second lines in the preceding code snippet didn't have an output to be displayed, so R just immediately asked for more input. This is because assignments don't have a return value. Their only job is to give a value to a variable or change the existing value of a variable. Generally, operations and functions on variables in R don't change the value of the variable. Instead, they return the result of the operation. If you want to change a variable to the result of an operation using that variable, you have to reassign that variable as follows:

   > var               # var is 10 
   [1] 10 
   > var ^ 2 
   [1] 100 
   > var               # var is still 10 
   [1] 10 
   > var <- var ^ 2    # no return value 
   > var               # var is now 100 
   [1] 100 

Be aware that variable names may contain numbers, underscores, and periods; this is something that trips up a lot of people who are familiar with other programming languages that disallow using periods in variable names. The only further restrictions on variable names are that they must start with a letter (or a period and then a letter), and that it must not be one of the reserved words in R such as TRUE, Inf, and so on.

Although the arithmetic operators that we've seen thus far are functions in their own right, most functions in R take the form,  function_name(value(s) supplied to the function). The values supplied to the function are called arguments of that function:

   > cos(3.14159)      # cosine function 
   [1] -1 
   > cos(pi)           # pi is a constant that R provides 
   [1] -1 
   > acos(-1)          # arccosine function 
   [1] 3.141593
   > acos(cos(pi)) + 10  
   [1] 13.14159 
   > # functions can be used as arguments to other functions 

If you paid attention in math class, you'll know that the cosine of pi is -1 and that arccosine is the inverse function of cosine.

There are hundreds of such useful functions defined in base R, only a handful of which we will see in this book. Two sections from now, we will be building our very own functions.

Before we move on from arithmetic, it will serve us well to visit some of the odd values that may result from certain operations:

   > 1 / 0 
   [1] Inf 
   > 0 / 0 
   [1] NaN 

It is common during practical usage of R to accidentally divide by zero. As you can see, this undefined operation yields an infinite value in R. Dividing zero by zero yields the value NaN, which stands for Not a Number.

Logicals and characters

So far, we've only been dealing with numerics, but there are other atomic data types in R:

   > foo <- TRUE        # foo is of the logical data type 
   > class(foo)         # class() tells us the type 
   [1] "logical" 
   > bar <- "hi!"       # bar is of the character data type 
   > class(bar) 
   [1] "character" 

The logical data type (also called Booleans) can hold the values TRUE or FALSE or, equivalently, T or F. The familiar operators from Boolean algebra are defined for these types:

   > foo 
   [1] TRUE 
   > foo && TRUE                 # boolean and 
   [1] TRUE 
   > foo && FALSE 
   [1] FALSE 
   > foo || FALSE                # boolean or 
   [1] TRUE 
   > !foo                        # negation operator 
   [1] FALSE 

In a Boolean expression with a logical value and a number, any number that is not 0 is interpreted as TRUE:

   > foo && 1 
   [1] TRUE 
   > foo && 2 
   [1] TRUE 
   > foo && 0 
   [1] FALSE 

Additionally, there are functions and operators that return logical values such as the following:

   > 4 < 2           # less than operator 
   [1] FALSE 
   > 4 >= 4          # greater than or equal to 
   [1] TRUE 
   > 3 == 3          # equality operator 
   [1] TRUE 
   > 3 != 2          # inequality operator 
   [1] TRUE 

Just as there are functions in R that are only defined for work on the numeric and logical data type, there are other functions that are designed to work only with the character data type, also known as strings:

   > lang.domain <- "statistics" 
   > lang.domain <- toupper(lang.domain) 
   > print(lang.domain) 
   [1] "STATISTICS" 
   > # retrieves substring from first character to fourth character 
   > substr(lang.domain, 1, 4)           
   [1] "STAT" 
   > gsub("I", "1", lang.domain)  # substitutes every "I" for "1" 
   [1] "STAT1ST1CS" 
   > # combines character strings 
   > paste("R does", lang.domain, "!!!") 
   [1] "R does STATISTICS !!!" 

Flow of control

The last topic in this section will be flow of control constructs.

The most basic flow of control construct is the if statement. The argument to an if statement (what goes between the parentheses) is an expression that returns a logical value. The block of code following the if statement gets executed only if the expression yields TRUE:

   > if(2 + 2 == 4) 
   +   print("very good") 
  [1] "very good" 
   > if(2 + 2 == 5) 
   +    print("all hail to the thief") 

It is possible to execute more than one statement if an if condition is triggered; you just have to use curly brackets ({}) to contain the statements:

   > if((4/2==2) && (2*2==4)){ 
   +    print("four divided by two is two...") 
   +    print("and two times two is four") 
   + } 
  [1] "four divided by two is two..." 
  [1] "and two times two is four"  

It is also possible to specify a block of code that will get executed if the if conditional is FALSE:

   > closing.time <- TRUE 
   > if(closing.time){ 
   +    print("you don't have to go home") 
   +    print("but you can't stay here") 
   + } else{ 
   +    print("you can stay here!") 
   + } 
  [1] "you don't have to go home" 
  [1] "but you can't stay here" 
  > if(!closing.time){ 
  +     print("you don't have to go home") 
  +     print("but you can't stay here") 
  + } else{ 
  +     print("you can stay here!") 
  + } 
  [1] "you can stay here!"  

There are other flow of control constructs (like while and for), but we won't be directly using them much in this text.

lock icon The rest of the chapter is locked
Register for a free Packt account to unlock a world of extra content!
A free Packt account unlocks extra newsletters, articles, discounted offers, and much more. Start advancing your knowledge today.
Unlock this book and the full library FREE for 7 days
Get unlimited access to 7000+ expert-authored eBooks and videos courses covering every tech area you can think of
Renews at AU $24.99/month. Cancel anytime