Import stock prices

Stocks from Home Depot, Lowe’s & COSTCO

stocks <- tq_get(c("HD", "LOW", "COST"),
                 get = "stock.prices",
                 from = "2018-01-01")
stocks
## # A tibble: 6,558 × 8
##    symbol date        open  high   low close  volume adjusted
##    <chr>  <date>     <dbl> <dbl> <dbl> <dbl>   <dbl>    <dbl>
##  1 HD     2018-01-02  190.  191.  188.  188. 4684700     152.
##  2 HD     2018-01-03  188   189.  188.  189. 4530500     152.
##  3 HD     2018-01-04  190.  191.  188.  191. 4047400     154.
##  4 HD     2018-01-05  191.  193.  191.  192. 4224800     155.
##  5 HD     2018-01-08  192.  194.  192.  192. 3508500     155.
##  6 HD     2018-01-09  193.  193.  192.  193. 3012300     156.
##  7 HD     2018-01-10  193.  193.  192.  192. 3119500     155.
##  8 HD     2018-01-11  192.  195.  191.  195. 3899200     157.
##  9 HD     2018-01-12  196.  199.  195.  196. 6748400     158.
## 10 HD     2018-01-16  198.  199.  196.  196. 5692700     158.
## # ℹ 6,548 more rows

Plot stock prices

stocks %>%
    
    ggplot(aes(x = date, y = adjusted, color = symbol)) +
    geom_line()

Apply the dplyr verbs you learned in chapter 5

Filter Rows

filter(stocks, adjusted > 30)
## # A tibble: 6,558 × 8
##    symbol date        open  high   low close  volume adjusted
##    <chr>  <date>     <dbl> <dbl> <dbl> <dbl>   <dbl>    <dbl>
##  1 HD     2018-01-02  190.  191.  188.  188. 4684700     152.
##  2 HD     2018-01-03  188   189.  188.  189. 4530500     152.
##  3 HD     2018-01-04  190.  191.  188.  191. 4047400     154.
##  4 HD     2018-01-05  191.  193.  191.  192. 4224800     155.
##  5 HD     2018-01-08  192.  194.  192.  192. 3508500     155.
##  6 HD     2018-01-09  193.  193.  192.  193. 3012300     156.
##  7 HD     2018-01-10  193.  193.  192.  192. 3119500     155.
##  8 HD     2018-01-11  192.  195.  191.  195. 3899200     157.
##  9 HD     2018-01-12  196.  199.  195.  196. 6748400     158.
## 10 HD     2018-01-16  198.  199.  196.  196. 5692700     158.
## # ℹ 6,548 more rows
filter(stocks, open < 188)
## # A tibble: 1,083 × 8
##    symbol date        open  high   low close   volume adjusted
##    <chr>  <date>     <dbl> <dbl> <dbl> <dbl>    <dbl>    <dbl>
##  1 HD     2018-02-06  179.  192.  175.  191. 11682700     154.
##  2 HD     2018-02-09  183.  186   176.  184.  9059200     148.
##  3 HD     2018-02-12  187.  187.  183.  184.  6783700     148.
##  4 HD     2018-02-13  183.  184.  181.  184.  4273800     148.
##  5 HD     2018-02-14  182.  185.  181.  185.  6767000     149.
##  6 HD     2018-02-15  187.  187.  183.  185.  5113300     149.
##  7 HD     2018-02-16  185.  188.  185.  187.  7619200     151.
##  8 HD     2018-02-21  187.  188.  183.  183.  7527200     148.
##  9 HD     2018-02-22  184.  186.  183.  185.  5653900     149.
## 10 HD     2018-02-23  186.  188.  186.  188.  4315400     152.
## # ℹ 1,073 more rows
filter(stocks, close > 188)
## # A tibble: 5,471 × 8
##    symbol date        open  high   low close  volume adjusted
##    <chr>  <date>     <dbl> <dbl> <dbl> <dbl>   <dbl>    <dbl>
##  1 HD     2018-01-02  190.  191.  188.  188. 4684700     152.
##  2 HD     2018-01-03  188   189.  188.  189. 4530500     152.
##  3 HD     2018-01-04  190.  191.  188.  191. 4047400     154.
##  4 HD     2018-01-05  191.  193.  191.  192. 4224800     155.
##  5 HD     2018-01-08  192.  194.  192.  192. 3508500     155.
##  6 HD     2018-01-09  193.  193.  192.  193. 3012300     156.
##  7 HD     2018-01-10  193.  193.  192.  192. 3119500     155.
##  8 HD     2018-01-11  192.  195.  191.  195. 3899200     157.
##  9 HD     2018-01-12  196.  199.  195.  196. 6748400     158.
## 10 HD     2018-01-16  198.  199.  196.  196. 5692700     158.
## # ℹ 5,461 more rows

Arrange rows

arrange(stocks, desc(open), desc(date))
## # A tibble: 6,558 × 8
##    symbol date        open  high   low close  volume adjusted
##    <chr>  <date>     <dbl> <dbl> <dbl> <dbl>   <dbl>    <dbl>
##  1 COST   2026-05-20 1089. 1090. 1072  1074. 2223400    1072.
##  2 COST   2026-05-19 1077  1096. 1072. 1094. 2853300    1093.
##  3 COST   2025-02-14 1076. 1077. 1068. 1072. 1410700    1063.
##  4 COST   2025-02-18 1069. 1071  1045. 1056. 2090600    1047.
##  5 COST   2025-02-13 1067. 1078. 1065. 1077. 1623300    1068.
##  6 COST   2026-05-21 1063. 1065. 1039. 1050. 2149700    1049.
##  7 COST   2025-02-11 1060. 1066  1049. 1058. 1748500    1049.
##  8 COST   2025-02-19 1056. 1063. 1053  1063. 1349600    1054.
##  9 COST   2025-06-04 1055  1058. 1049. 1052. 1422100    1044.
## 10 COST   2025-06-03 1054. 1067. 1043. 1056. 1992900    1048.
## # ℹ 6,548 more rows

Select columns

select(stocks, open:close)
## # A tibble: 6,558 × 4
##     open  high   low close
##    <dbl> <dbl> <dbl> <dbl>
##  1  190.  191.  188.  188.
##  2  188   189.  188.  189.
##  3  190.  191.  188.  191.
##  4  191.  193.  191.  192.
##  5  192.  194.  192.  192.
##  6  193.  193.  192.  193.
##  7  193.  193.  192.  192.
##  8  192.  195.  191.  195.
##  9  196.  199.  195.  196.
## 10  198.  199.  196.  196.
## # ℹ 6,548 more rows
select(stocks, open, high, close)
## # A tibble: 6,558 × 3
##     open  high close
##    <dbl> <dbl> <dbl>
##  1  190.  191.  188.
##  2  188   189.  189.
##  3  190.  191.  191.
##  4  191.  193.  192.
##  5  192.  194.  192.
##  6  193.  193.  193.
##  7  193.  193.  192.
##  8  192.  195.  195.
##  9  196.  199.  196.
## 10  198.  199.  196.
## # ℹ 6,548 more rows
select(stocks, open, high, close, low)
## # A tibble: 6,558 × 4
##     open  high close   low
##    <dbl> <dbl> <dbl> <dbl>
##  1  190.  191.  188.  188.
##  2  188   189.  189.  188.
##  3  190.  191.  191.  188.
##  4  191.  193.  192.  191.
##  5  192.  194.  192.  192.
##  6  193.  193.  193.  192.
##  7  193.  193.  192.  192.
##  8  192.  195.  195.  191.
##  9  196.  199.  196.  195.
## 10  198.  199.  196.  196.
## # ℹ 6,548 more rows
select(stocks, open, high, close, adjusted, volume)
## # A tibble: 6,558 × 5
##     open  high close adjusted  volume
##    <dbl> <dbl> <dbl>    <dbl>   <dbl>
##  1  190.  191.  188.     152. 4684700
##  2  188   189.  189.     152. 4530500
##  3  190.  191.  191.     154. 4047400
##  4  191.  193.  192.     155. 4224800
##  5  192.  194.  192.     155. 3508500
##  6  193.  193.  193.     156. 3012300
##  7  193.  193.  192.     155. 3119500
##  8  192.  195.  195.     157. 3899200
##  9  196.  199.  196.     158. 6748400
## 10  198.  199.  196.     158. 5692700
## # ℹ 6,548 more rows

Add columns

mutate(stocks,
       gain = close - open) %>%

    # Select date and gain
    select(date, gain)
## # A tibble: 6,558 × 2
##    date         gain
##    <date>      <dbl>
##  1 2018-01-02 -2.18 
##  2 2018-01-03  1.01 
##  3 2018-01-04  0.640
##  4 2018-01-05  1.57 
##  5 2018-01-08  0.320
##  6 2018-01-09  0.400
##  7 2018-01-10 -0.960
##  8 2018-01-11  3    
##  9 2018-01-12  0.920
## 10 2018-01-16 -1.55 
## # ℹ 6,548 more rows
# Just keep gain
mutate(stocks,
       gain = close - open) %>%

    # Select year, month, day, and gain
    select(gain)
## # A tibble: 6,558 × 1
##      gain
##     <dbl>
##  1 -2.18 
##  2  1.01 
##  3  0.640
##  4  1.57 
##  5  0.320
##  6  0.400
##  7 -0.960
##  8  3    
##  9  0.920
## 10 -1.55 
## # ℹ 6,548 more rows
# alternative using transmute()
transmute(stocks,
          gain = close - open)
## # A tibble: 6,558 × 1
##      gain
##     <dbl>
##  1 -2.18 
##  2  1.01 
##  3  0.640
##  4  1.57 
##  5  0.320
##  6  0.400
##  7 -0.960
##  8  3    
##  9  0.920
## 10 -1.55 
## # ℹ 6,548 more rows
# lag()
select(stocks, open) %>%
    
    mutate(open_lag1 = lag(open))
## # A tibble: 6,558 × 2
##     open open_lag1
##    <dbl>     <dbl>
##  1  190.       NA 
##  2  188       190.
##  3  190.      188 
##  4  191.      190.
##  5  192.      191.
##  6  193.      192.
##  7  193.      193.
##  8  192.      193.
##  9  196.      192.
## 10  198.      196.
## # ℹ 6,548 more rows
# cumsum()
select(stocks, close) %>%
    
    mutate(close_cumsum = cumsum(close))
## # A tibble: 6,558 × 2
##    close close_cumsum
##    <dbl>        <dbl>
##  1  188.         188.
##  2  189.         377.
##  3  191.         568.
##  4  192.         760.
##  5  192.         952.
##  6  193.        1145.
##  7  192.        1337.
##  8  195.        1532.
##  9  196.        1728.
## 10  196.        1924.
## # ℹ 6,548 more rows

Summarize with groups

Collapsing data to a single row

stocks
## # A tibble: 6,558 × 8
##    symbol date        open  high   low close  volume adjusted
##    <chr>  <date>     <dbl> <dbl> <dbl> <dbl>   <dbl>    <dbl>
##  1 HD     2018-01-02  190.  191.  188.  188. 4684700     152.
##  2 HD     2018-01-03  188   189.  188.  189. 4530500     152.
##  3 HD     2018-01-04  190.  191.  188.  191. 4047400     154.
##  4 HD     2018-01-05  191.  193.  191.  192. 4224800     155.
##  5 HD     2018-01-08  192.  194.  192.  192. 3508500     155.
##  6 HD     2018-01-09  193.  193.  192.  193. 3012300     156.
##  7 HD     2018-01-10  193.  193.  192.  192. 3119500     155.
##  8 HD     2018-01-11  192.  195.  191.  195. 3899200     157.
##  9 HD     2018-01-12  196.  199.  195.  196. 6748400     158.
## 10 HD     2018-01-16  198.  199.  196.  196. 5692700     158.
## # ℹ 6,548 more rows
# average volume
summarise(stocks, volume = mean(volume, na.rm = TRUE))
## # A tibble: 1 × 1
##     volume
##      <dbl>
## 1 3377965.

Summarize by group

stocks %>%

    # Group by ticker
    group_by(symbol) %>%
    
    # Calculate average volume
    summarise(volume = mean(volume, na.rm = TRUE)) %>%
    
    # Sort it
    arrange(volume)
## # A tibble: 3 × 2
##   symbol   volume
##   <chr>     <dbl>
## 1 COST   2236694.
## 2 LOW    3788860.
## 3 HD     4108340.

Show gap between prices

stocks %>%
    mutate(gap = low - high) %>%
    group_by(gap) %>%
    summarise(count = n(),
              lowest = mean(low, na.rm = TRUE),
              highest = mean(high, na.rm = TRUE)) %>%
    
    # Plot
    ggplot(mapping = aes(x = lowest, y = highest)) +
    geom_point(aes(size = count), alpha = 0.3) +
    geom_smooth(se = FALSE)
## `geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'

Missing Values

stocks %>%
    
    # Remove missing values
    filter(!is.na(volume))
## # A tibble: 6,558 × 8
##    symbol date        open  high   low close  volume adjusted
##    <chr>  <date>     <dbl> <dbl> <dbl> <dbl>   <dbl>    <dbl>
##  1 HD     2018-01-02  190.  191.  188.  188. 4684700     152.
##  2 HD     2018-01-03  188   189.  188.  189. 4530500     152.
##  3 HD     2018-01-04  190.  191.  188.  191. 4047400     154.
##  4 HD     2018-01-05  191.  193.  191.  192. 4224800     155.
##  5 HD     2018-01-08  192.  194.  192.  192. 3508500     155.
##  6 HD     2018-01-09  193.  193.  192.  193. 3012300     156.
##  7 HD     2018-01-10  193.  193.  192.  192. 3119500     155.
##  8 HD     2018-01-11  192.  195.  191.  195. 3899200     157.
##  9 HD     2018-01-12  196.  199.  195.  196. 6748400     158.
## 10 HD     2018-01-16  198.  199.  196.  196. 5692700     158.
## # ℹ 6,548 more rows

grouping by multiple variables

stocks %>%
    group_by(open, close, high, low) %>%
    summarise(count = n()) %>%
    ungroup()
## `summarise()` has regrouped the output.
## ℹ Summaries were computed grouped by open, close, high, and low.
## ℹ Output is grouped by open, close, and high.
## ℹ Use `summarise(.groups = "drop_last")` to silence this message.
## ℹ Use `summarise(.by = c(open, close, high, low))` for per-operation grouping
##   (`?dplyr::dplyr_by`) instead.
## # A tibble: 6,558 × 5
##     open close  high   low count
##    <dbl> <dbl> <dbl> <dbl> <int>
##  1  64.4  69.9  73.2  60       1
##  2  65.2  67.8  69.1  63.0     1
##  3  68.5  65.0  70.1  61       1
##  4  72.2  66.4  73.0  65.5     1
##  5  72.8  77.3  77.6  72.1     1
##  6  73.6  73.8  75.6  64.2     1
##  7  79.8  82.9  83.3  79.2     1
##  8  80.1  83.7  87.0  78.3     1
##  9  80.7  80.4  83.9  79.1     1
## 10  81.8  83.0  83.0  81.2     1
## # ℹ 6,548 more rows