Import stock prices

stocks <- tq_get(c("NVDA", "MSFT", "GOOGL", "META"),
                 get = "stock.prices",
                 from = "2020-01-01")
stocks
## # A tibble: 5,716 × 8
##    symbol date        open  high   low close    volume adjusted
##    <chr>  <date>     <dbl> <dbl> <dbl> <dbl>     <dbl>    <dbl>
##  1 NVDA   2020-01-02  5.97  6.00  5.92  6.00 237536000     5.97
##  2 NVDA   2020-01-03  5.88  5.95  5.85  5.90 205384000     5.88
##  3 NVDA   2020-01-06  5.81  5.93  5.78  5.93 262636000     5.90
##  4 NVDA   2020-01-07  5.95  6.04  5.91  6.00 314856000     5.97
##  5 NVDA   2020-01-08  5.99  6.05  5.95  6.01 277108000     5.98
##  6 NVDA   2020-01-09  6.10  6.15  6.02  6.08 255112000     6.05
##  7 NVDA   2020-01-10  6.18  6.21  6.09  6.11 316296000     6.08
##  8 NVDA   2020-01-13  6.19  6.32  6.17  6.30 319840000     6.27
##  9 NVDA   2020-01-14  6.26  6.28  6.17  6.18 359088000     6.16
## 10 NVDA   2020-01-15  6.19  6.22  6.11  6.14 263104000     6.11
## # ℹ 5,706 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

stocks %>% filter(adjusted > 24)
## # A tibble: 5,005 × 8
##    symbol date        open  high   low close     volume adjusted
##    <chr>  <date>     <dbl> <dbl> <dbl> <dbl>      <dbl>    <dbl>
##  1 NVDA   2021-10-26  24.0  25.3  23.9  24.7  485898000     24.7
##  2 NVDA   2021-10-27  24.5  25.1  24.3  24.5  245990000     24.4
##  3 NVDA   2021-10-28  24.9  25.0  24.5  24.9  234204000     24.9
##  4 NVDA   2021-10-29  25.0  25.7  25    25.6  292503000     25.5
##  5 NVDA   2021-11-01  25.6  25.9  25.2  25.8  265740000     25.8
##  6 NVDA   2021-11-02  25.8  26.7  25.8  26.4  294112000     26.3
##  7 NVDA   2021-11-03  26.7  26.8  26.2  26.6  239910000     26.5
##  8 NVDA   2021-11-04  27.2  31.4  27.1  29.8 1153631000     29.7
##  9 NVDA   2021-11-05  30.2  31.4  29.4  29.8  851260000     29.7
## 10 NVDA   2021-11-08  30.1  31.1  29.9  30.8  503101000     30.7
## # ℹ 4,995 more rows
stocks %>% filter(high > 780)
## # A tibble: 6 × 8
##   symbol date        open  high   low close   volume adjusted
##   <chr>  <date>     <dbl> <dbl> <dbl> <dbl>    <dbl>    <dbl>
## 1 META   2025-07-31  775.  785.  766.  773. 38831100     773.
## 2 META   2025-08-05  776.  783.  763   763. 11640300     763.
## 3 META   2025-08-12  773   794.  772.  790  14563100     790 
## 4 META   2025-08-13  791.  795.  778.  780.  8811800     780.
## 5 META   2025-08-14  778.  788.  773.  782.  8116200     782.
## 6 META   2025-08-15  784.  796.  781.  785. 13375400     785.
filter(stocks, high < 400, low > 375)
## # A tibble: 55 × 8
##    symbol date        open  high   low close   volume adjusted
##    <chr>  <date>     <dbl> <dbl> <dbl> <dbl>    <dbl>    <dbl>
##  1 MSFT   2023-11-24  377.  378.  375.  377. 10176600     373.
##  2 MSFT   2023-11-27  377.  381.  376.  379. 22179200     374.
##  3 MSFT   2023-11-28  378.  383   378.  383. 20453100     378.
##  4 MSFT   2023-11-29  384.  384.  377.  379. 28963400     374.
##  5 MSFT   2023-11-30  378.  380.  375.  379. 30554400     374.
##  6 MSFT   2024-01-10  376.  384.  376.  383. 25514200     378.
##  7 MSFT   2024-01-11  386   391.  380.  385. 27850800     380.
##  8 MSFT   2024-01-12  385.  389.  385.  388. 21661200     383.
##  9 MSFT   2024-01-16  394.  394.  388.  390. 27202300     385.
## 10 MSFT   2024-01-17  388.  390.  385.  389. 22234100     384.
## # ℹ 45 more rows

arrange rows

arrange(stocks, date, symbol, high)
## # A tibble: 5,716 × 8
##    symbol date         open   high    low  close    volume adjusted
##    <chr>  <date>      <dbl>  <dbl>  <dbl>  <dbl>     <dbl>    <dbl>
##  1 GOOGL  2020-01-02  67.4   68.4   67.3   68.4   27278000    68.0 
##  2 META   2020-01-02 207.   210.   206.   210.    12077100   209.  
##  3 MSFT   2020-01-02 159.   161.   158.   161.    22622100   153.  
##  4 NVDA   2020-01-02   5.97   6.00   5.92   6.00 237536000     5.97
##  5 GOOGL  2020-01-03  67.4   68.7   67.4   68.1   23408000    67.6 
##  6 META   2020-01-03 207.   210.   207.   209.    11188400   208.  
##  7 MSFT   2020-01-03 158.   160.   158.   159.    21116200   151.  
##  8 NVDA   2020-01-03   5.88   5.95   5.85   5.90 205384000     5.88
##  9 GOOGL  2020-01-06  67.6   69.9   67.6   69.9   46768000    69.4 
## 10 META   2020-01-06 207.   213.   207.   213.    17058900   211.  
## # ℹ 5,706 more rows
arrange(stocks,desc(date))
## # A tibble: 5,716 × 8
##    symbol date        open  high   low close    volume adjusted
##    <chr>  <date>     <dbl> <dbl> <dbl> <dbl>     <dbl>    <dbl>
##  1 NVDA   2025-09-09  169.  171.  167.  171. 156305800     171.
##  2 MSFT   2025-09-09  501.  502.  498.  498.  14349500     498.
##  3 GOOGL  2025-09-09  234.  240.  233.  240.  38012800     240.
##  4 META   2025-09-09  757.  766.  753.  766.  10986800     766.
##  5 NVDA   2025-09-08  168.  171.  167.  168. 163769100     168.
##  6 MSFT   2025-09-08  498.  501.  495.  498.  16771000     498.
##  7 GOOGL  2025-09-08  235.  238.  234.  234.  32474700     234.
##  8 META   2025-09-08  756   767.  752.  752.  13087800     752.
##  9 NVDA   2025-09-05  168.  169.  164.  167. 224441400     167.
## 10 MSFT   2025-09-05  509.  512.  492.  495   31994800     495 
## # ℹ 5,706 more rows

select columns

select(stocks, date, symbol, open:close)
## # A tibble: 5,716 × 6
##    date       symbol  open  high   low close
##    <date>     <chr>  <dbl> <dbl> <dbl> <dbl>
##  1 2020-01-02 NVDA    5.97  6.00  5.92  6.00
##  2 2020-01-03 NVDA    5.88  5.95  5.85  5.90
##  3 2020-01-06 NVDA    5.81  5.93  5.78  5.93
##  4 2020-01-07 NVDA    5.95  6.04  5.91  6.00
##  5 2020-01-08 NVDA    5.99  6.05  5.95  6.01
##  6 2020-01-09 NVDA    6.10  6.15  6.02  6.08
##  7 2020-01-10 NVDA    6.18  6.21  6.09  6.11
##  8 2020-01-13 NVDA    6.19  6.32  6.17  6.30
##  9 2020-01-14 NVDA    6.26  6.28  6.17  6.18
## 10 2020-01-15 NVDA    6.19  6.22  6.11  6.14
## # ℹ 5,706 more rows
select(stocks, -(open:close))
## # A tibble: 5,716 × 4
##    symbol date          volume adjusted
##    <chr>  <date>         <dbl>    <dbl>
##  1 NVDA   2020-01-02 237536000     5.97
##  2 NVDA   2020-01-03 205384000     5.88
##  3 NVDA   2020-01-06 262636000     5.90
##  4 NVDA   2020-01-07 314856000     5.97
##  5 NVDA   2020-01-08 277108000     5.98
##  6 NVDA   2020-01-09 255112000     6.05
##  7 NVDA   2020-01-10 316296000     6.08
##  8 NVDA   2020-01-13 319840000     6.27
##  9 NVDA   2020-01-14 359088000     6.16
## 10 NVDA   2020-01-15 263104000     6.11
## # ℹ 5,706 more rows

add columns

mutate(stocks,
       price_change = close - open) %>%
    select(date, symbol, price_change)
## # A tibble: 5,716 × 3
##    date       symbol price_change
##    <date>     <chr>         <dbl>
##  1 2020-01-02 NVDA         0.0290
##  2 2020-01-03 NVDA         0.0243
##  3 2020-01-06 NVDA         0.118 
##  4 2020-01-07 NVDA         0.0433
##  5 2020-01-08 NVDA         0.0155
##  6 2020-01-09 NVDA        -0.0208
##  7 2020-01-10 NVDA        -0.0753
##  8 2020-01-13 NVDA         0.108 
##  9 2020-01-14 NVDA        -0.0745
## 10 2020-01-15 NVDA        -0.0555
## # ℹ 5,706 more rows
mutate(stocks,
       price_change = close - open) %>%
    select(price_change)
## # A tibble: 5,716 × 1
##    price_change
##           <dbl>
##  1       0.0290
##  2       0.0243
##  3       0.118 
##  4       0.0433
##  5       0.0155
##  6      -0.0208
##  7      -0.0753
##  8       0.108 
##  9      -0.0745
## 10      -0.0555
## # ℹ 5,706 more rows
transmute(stocks,
          price_change = close - open)
## # A tibble: 5,716 × 1
##    price_change
##           <dbl>
##  1       0.0290
##  2       0.0243
##  3       0.118 
##  4       0.0433
##  5       0.0155
##  6      -0.0208
##  7      -0.0753
##  8       0.108 
##  9      -0.0745
## 10      -0.0555
## # ℹ 5,706 more rows

summarise with groups

stocks %>%
    group_by(symbol) %>%
summarise(avg_price_change = mean(close - open, na.rm = TRUE)) %>%
    arrange(avg_price_change)
## # A tibble: 4 × 2
##   symbol avg_price_change
##   <chr>             <dbl>
## 1 NVDA             0.0107
## 2 GOOGL            0.0872
## 3 MSFT             0.0903
## 4 META             0.111
stocks %>%
    group_by(symbol) %>%
    summarise(count = n(),
              avg_volume = mean(volume, na.rm =TRUE),
              price_change = mean(close - open, na.rm = TRUE))
## # A tibble: 4 × 4
##   symbol count avg_volume price_change
##   <chr>  <int>      <dbl>        <dbl>
## 1 GOOGL   1429  33531858.       0.0872
## 2 META    1429  22151370.       0.111 
## 3 MSFT    1429  27865120.       0.0903
## 4 NVDA    1429 421692336.       0.0107