13 Solutions

There is way more than one way to solve these challenges. Notice the differences between my solution and yours. Why are those differences there? Are they just differences in style or are they differences in function? In what ways is your solution better? In what ways is mine better?

13.1 Hello

# Function: hello_world_name -----
# Description: Prints "Hello World"
# Inputs: name - character string
# Outputs: Character string "Hello World, my name is _____!"

# Required packages
# None

# Example call
# hello_world("Thomas")


hello_world_name <- function(name = "_____") {
  # Function body
  print(paste0("Hello world, my name is ", name, "!"))
} ## End function -----
hello_world_name(name = "Thomas")
# [1] "Hello world, my name is Thomas!"

13.2 Freeform

I chose to explore the built in iris data set.

iris
#     Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
# 1            5.1         3.5          1.4         0.2     setosa
# 2            4.9         3.0          1.4         0.2     setosa
# 3            4.7         3.2          1.3         0.2     setosa
# 4            4.6         3.1          1.5         0.2     setosa
# 5            5.0         3.6          1.4         0.2     setosa
# 6            5.4         3.9          1.7         0.4     setosa
# 7            4.6         3.4          1.4         0.3     setosa
# 8            5.0         3.4          1.5         0.2     setosa
# 9            4.4         2.9          1.4         0.2     setosa
# 10           4.9         3.1          1.5         0.1     setosa
# 11           5.4         3.7          1.5         0.2     setosa
# 12           4.8         3.4          1.6         0.2     setosa
# 13           4.8         3.0          1.4         0.1     setosa
# 14           4.3         3.0          1.1         0.1     setosa
# 15           5.8         4.0          1.2         0.2     setosa
# 16           5.7         4.4          1.5         0.4     setosa
# 17           5.4         3.9          1.3         0.4     setosa
# 18           5.1         3.5          1.4         0.3     setosa
# 19           5.7         3.8          1.7         0.3     setosa
# 20           5.1         3.8          1.5         0.3     setosa
# 21           5.4         3.4          1.7         0.2     setosa
# 22           5.1         3.7          1.5         0.4     setosa
# 23           4.6         3.6          1.0         0.2     setosa
# 24           5.1         3.3          1.7         0.5     setosa
# 25           4.8         3.4          1.9         0.2     setosa
# 26           5.0         3.0          1.6         0.2     setosa
# 27           5.0         3.4          1.6         0.4     setosa
# 28           5.2         3.5          1.5         0.2     setosa
# 29           5.2         3.4          1.4         0.2     setosa
# 30           4.7         3.2          1.6         0.2     setosa
# 31           4.8         3.1          1.6         0.2     setosa
# 32           5.4         3.4          1.5         0.4     setosa
# 33           5.2         4.1          1.5         0.1     setosa
# 34           5.5         4.2          1.4         0.2     setosa
# 35           4.9         3.1          1.5         0.2     setosa
# 36           5.0         3.2          1.2         0.2     setosa
# 37           5.5         3.5          1.3         0.2     setosa
# 38           4.9         3.6          1.4         0.1     setosa
# 39           4.4         3.0          1.3         0.2     setosa
# 40           5.1         3.4          1.5         0.2     setosa
# 41           5.0         3.5          1.3         0.3     setosa
# 42           4.5         2.3          1.3         0.3     setosa
# 43           4.4         3.2          1.3         0.2     setosa
# 44           5.0         3.5          1.6         0.6     setosa
# 45           5.1         3.8          1.9         0.4     setosa
# 46           4.8         3.0          1.4         0.3     setosa
# 47           5.1         3.8          1.6         0.2     setosa
# 48           4.6         3.2          1.4         0.2     setosa
# 49           5.3         3.7          1.5         0.2     setosa
# 50           5.0         3.3          1.4         0.2     setosa
# 51           7.0         3.2          4.7         1.4 versicolor
# 52           6.4         3.2          4.5         1.5 versicolor
# 53           6.9         3.1          4.9         1.5 versicolor
# 54           5.5         2.3          4.0         1.3 versicolor
# 55           6.5         2.8          4.6         1.5 versicolor
# 56           5.7         2.8          4.5         1.3 versicolor
# 57           6.3         3.3          4.7         1.6 versicolor
# 58           4.9         2.4          3.3         1.0 versicolor
# 59           6.6         2.9          4.6         1.3 versicolor
# 60           5.2         2.7          3.9         1.4 versicolor
# 61           5.0         2.0          3.5         1.0 versicolor
# 62           5.9         3.0          4.2         1.5 versicolor
# 63           6.0         2.2          4.0         1.0 versicolor
# 64           6.1         2.9          4.7         1.4 versicolor
# 65           5.6         2.9          3.6         1.3 versicolor
# 66           6.7         3.1          4.4         1.4 versicolor
# 67           5.6         3.0          4.5         1.5 versicolor
# 68           5.8         2.7          4.1         1.0 versicolor
# 69           6.2         2.2          4.5         1.5 versicolor
# 70           5.6         2.5          3.9         1.1 versicolor
# 71           5.9         3.2          4.8         1.8 versicolor
# 72           6.1         2.8          4.0         1.3 versicolor
# 73           6.3         2.5          4.9         1.5 versicolor
# 74           6.1         2.8          4.7         1.2 versicolor
# 75           6.4         2.9          4.3         1.3 versicolor
# 76           6.6         3.0          4.4         1.4 versicolor
# 77           6.8         2.8          4.8         1.4 versicolor
# 78           6.7         3.0          5.0         1.7 versicolor
# 79           6.0         2.9          4.5         1.5 versicolor
# 80           5.7         2.6          3.5         1.0 versicolor
# 81           5.5         2.4          3.8         1.1 versicolor
# 82           5.5         2.4          3.7         1.0 versicolor
# 83           5.8         2.7          3.9         1.2 versicolor
# 84           6.0         2.7          5.1         1.6 versicolor
# 85           5.4         3.0          4.5         1.5 versicolor
# 86           6.0         3.4          4.5         1.6 versicolor
# 87           6.7         3.1          4.7         1.5 versicolor
# 88           6.3         2.3          4.4         1.3 versicolor
# 89           5.6         3.0          4.1         1.3 versicolor
# 90           5.5         2.5          4.0         1.3 versicolor
# 91           5.5         2.6          4.4         1.2 versicolor
# 92           6.1         3.0          4.6         1.4 versicolor
# 93           5.8         2.6          4.0         1.2 versicolor
# 94           5.0         2.3          3.3         1.0 versicolor
# 95           5.6         2.7          4.2         1.3 versicolor
# 96           5.7         3.0          4.2         1.2 versicolor
# 97           5.7         2.9          4.2         1.3 versicolor
# 98           6.2         2.9          4.3         1.3 versicolor
# 99           5.1         2.5          3.0         1.1 versicolor
# 100          5.7         2.8          4.1         1.3 versicolor
# 101          6.3         3.3          6.0         2.5  virginica
# 102          5.8         2.7          5.1         1.9  virginica
# 103          7.1         3.0          5.9         2.1  virginica
# 104          6.3         2.9          5.6         1.8  virginica
# 105          6.5         3.0          5.8         2.2  virginica
# 106          7.6         3.0          6.6         2.1  virginica
# 107          4.9         2.5          4.5         1.7  virginica
# 108          7.3         2.9          6.3         1.8  virginica
# 109          6.7         2.5          5.8         1.8  virginica
# 110          7.2         3.6          6.1         2.5  virginica
# 111          6.5         3.2          5.1         2.0  virginica
# 112          6.4         2.7          5.3         1.9  virginica
# 113          6.8         3.0          5.5         2.1  virginica
# 114          5.7         2.5          5.0         2.0  virginica
# 115          5.8         2.8          5.1         2.4  virginica
# 116          6.4         3.2          5.3         2.3  virginica
# 117          6.5         3.0          5.5         1.8  virginica
# 118          7.7         3.8          6.7         2.2  virginica
# 119          7.7         2.6          6.9         2.3  virginica
# 120          6.0         2.2          5.0         1.5  virginica
# 121          6.9         3.2          5.7         2.3  virginica
# 122          5.6         2.8          4.9         2.0  virginica
# 123          7.7         2.8          6.7         2.0  virginica
# 124          6.3         2.7          4.9         1.8  virginica
# 125          6.7         3.3          5.7         2.1  virginica
# 126          7.2         3.2          6.0         1.8  virginica
# 127          6.2         2.8          4.8         1.8  virginica
# 128          6.1         3.0          4.9         1.8  virginica
# 129          6.4         2.8          5.6         2.1  virginica
# 130          7.2         3.0          5.8         1.6  virginica
# 131          7.4         2.8          6.1         1.9  virginica
# 132          7.9         3.8          6.4         2.0  virginica
# 133          6.4         2.8          5.6         2.2  virginica
# 134          6.3         2.8          5.1         1.5  virginica
# 135          6.1         2.6          5.6         1.4  virginica
# 136          7.7         3.0          6.1         2.3  virginica
# 137          6.3         3.4          5.6         2.4  virginica
# 138          6.4         3.1          5.5         1.8  virginica
# 139          6.0         3.0          4.8         1.8  virginica
# 140          6.9         3.1          5.4         2.1  virginica
# 141          6.7         3.1          5.6         2.4  virginica
# 142          6.9         3.1          5.1         2.3  virginica
# 143          5.8         2.7          5.1         1.9  virginica
# 144          6.8         3.2          5.9         2.3  virginica
# 145          6.7         3.3          5.7         2.5  virginica
# 146          6.7         3.0          5.2         2.3  virginica
# 147          6.3         2.5          5.0         1.9  virginica
# 148          6.5         3.0          5.2         2.0  virginica
# 149          6.2         3.4          5.4         2.3  virginica
# 150          5.9         3.0          5.1         1.8  virginica

dim(iris)
# [1] 150   5

str(iris)
# 'data.frame': 150 obs. of  5 variables:
#  $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
#  $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
#  $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
#  $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
#  $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...

# Distribution statistics in iris data
summary(iris)
#   Sepal.Length    Sepal.Width     Petal.Length    Petal.Width   
#  Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100  
#  1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300  
#  Median :5.800   Median :3.000   Median :4.350   Median :1.300  
#  Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199  
#  3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800  
#  Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500  
#        Species  
#  setosa    :50  
#  versicolor:50  
#  virginica :50  
#                 
#                 
# 

# There are better ways to do this in the tidyverse
summary(iris$Sepal.Length[iris$Species == "setosa"])
#    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#   4.300   4.800   5.000   5.006   5.200   5.800
summary(iris$Sepal.Length[iris$Species == "setosa"])
#    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#   4.300   4.800   5.000   5.006   5.200   5.800
summary(iris$Sepal.Length[iris$Species == "setosa"])
#    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#   4.300   4.800   5.000   5.006   5.200   5.800

# Histogram of Petal.Length
hist(iris$Petal.Length)

13.3 Loop

vector <- c("hello", "this", "is", "a", "character", "vector")
vec <- NULL
for (i in 1:length(vector)) {
  print(paste("loop #", i))
  vec <- paste(vec, vector[i])
  print(vec)
}
# [1] "loop # 1"
# [1] " hello"
# [1] "loop # 2"
# [1] " hello this"
# [1] "loop # 3"
# [1] " hello this is"
# [1] "loop # 4"
# [1] " hello this is a"
# [1] "loop # 5"
# [1] " hello this is a character"
# [1] "loop # 6"
# [1] " hello this is a character vector"

13.4 Tidy iris

iris_dat <- iris %>%
  # Save with individual samples go together by saving the row name
  rownames_to_column(var = "sample") %>%
  # Pivot the variables 
  pivot_longer(c(Sepal.Length, Sepal.Width, Petal.Length, Petal.Width),
               names_to = "measurement",
               values_to = "cm")

13.5 iris summary stats

iris_avg_tidy <- iris %>%
  rownames_to_column(var = "sample") %>%
  pivot_longer(c(Sepal.Length, Sepal.Width, Petal.Length, Petal.Width),
               names_to = "measurement",
               values_to = "cm") %>%
  group_by(Species, measurement) %>%
  summarize(avg = mean(cm), 
            sd = sd(cm))
# `summarise()` has grouped output by 'Species'. You can override using the
# `.groups` argument.
# Make a more easily human readable table
iris_avg_tidy %>%
  mutate(avg_sd = paste(signif(avg, 3), 
                        "±", 
                        signif(sd, 3))) %>%
  dplyr::select(-c(avg, sd)) %>%
  pivot_wider(names_from = Species,
              values_from = avg_sd) %>%
  kableExtra::kable()
measurement setosa versicolor virginica
Petal.Length 1.46 ± 0.174 4.26 ± 0.47 5.55 ± 0.552
Petal.Width 0.246 ± 0.105 1.33 ± 0.198 2.03 ± 0.275
Sepal.Length 5.01 ± 0.352 5.94 ± 0.516 6.59 ± 0.636
Sepal.Width 3.43 ± 0.379 2.77 ± 0.314 2.97 ± 0.322