Choosing stations in Peru pt. 2, Hydrological Stations
This is a follow-up to my last post, where I looked at some relevant meteorological stations for a study in Peru. Today, I will look for hydrological stations (river gauges), that could inform my study of flooding in the area. Libraries first.
In my previous post, I found just two river stations within 20 km of my study site. These were both downstream, though, so I think I will have to open up my radius a little more. Let’s see the stations that fall within 100 km of San Rafael.
hstations <- station_search(config = "h", target = c(-7.023833, -76.465222), dist = 1:100)
hstations
#> # A tibble: 12 x 15
#> # Rowwise:
#> Station StationID Type Configuration `Data Start` `Data End` `Period (Yr)`
#> <chr> <chr> <chr> <chr> <chr> <chr> <dbl>
#> 1 SAN CR… 221803 CON H 1968 1980 13
#> 2 PICOTA 230715 CON H 2003 2020 18
#> 3 BIAVO 221804 CON H 1969 2020 52
#> 4 SHAMBO… 221813 CON H 2006 2020 15
#> 5 HUAYAB… 230504 CON H 2005 2020 16
#> 6 DESAGU… 221807 CON H 1972 1991 20
#> 7 LAGUNA… 221806 CON H 1972 2020 49
#> 8 CAMPAN… 221821 CON H 1998 2020 23
#> 9 CUMBAZA 221801 CON H 1968 2020 53
#> 10 CHAZUTA 230601 CON H 2003 2020 18
#> 11 SHANAO 221802 CON H 1965 2020 56
#> 12 SHANAO 210006 SUT H 2016 2020 5
#> # … with 8 more variables: `Station Status` <chr>, Latitude <dbl>,
#> # Longitude <dbl>, Altitude <int>, Region <chr>, Province <chr>,
#> # District <chr>, Dist <dbl>
There are 12 stations within 100 km. Let’s see where these are located.
# This block won't run because it addAwesomeMarkers doesn't seem to work in hugodown
map_stations(hstations)
I can be pretty sure that I can discard Shamboyacu, Shanao, Cumbaza, and Laguna Sauce … these are on tributaries that are downstream of my study site. There are also a couple of closed stations that only have old data, so I can discard those as well. Chazuta isn’t near San Rafael, but I did do some interviews in that district, so I’ll keep the station for the time being.
hstations_filtered <- hstations %>%
filter(!(Station %in% c("CUMBAZA", "LAGUNA SAUCE", "SHANAO", "SHAMBOYACU")) &
`Station Status` != "closed")
Let’s see the stations that are left.
# This block won't run because it addAwesomeMarkers doesn't seem to work in hugodown
map_stations(hstations_filtered)
We can download that data using the senamhiR
package.
dat <- senamhiR(hstations_filtered$StationID)
Data audit
The completeness of the data can be assessed, as in my last post, with
quick_audit()
, in the senamhiR
package.
dat_audit <- lapply(dat, quick_audit, by = "year")
Station 1: PICOTA (230715)
dat_audit[[1]] %>% filter_at(2:ncol(.), any_vars(. < 100)) %>% print(n = 50)
#> # A tibble: 18 x 6
#> Year `Nivel06 (m) pc… `Nivel10 (m) pc… `Nivel14 (m) pc… `Nivel18 (m) pc…
#> <int> <dbl> <dbl> <dbl> <dbl>
#> 1 2003 0 0 0 0
#> 2 2004 0 0 0 0
#> 3 2005 0 0 0 0
#> 4 2006 0 0 0 0
#> 5 2007 0 0 0 0
#> 6 2008 0 0 0 0
#> 7 2009 0 0 0 0
#> 8 2010 0 0 0 0
#> 9 2011 0 0 0 0
#> 10 2012 0 0 0 0
#> 11 2013 0 0 0 0
#> 12 2014 0 0 0 0
#> 13 2015 75.3 75.3 75.3 75.3
#> 14 2016 0 0 0 0
#> 15 2017 0 0 0 0
#> 16 2018 0 0 0 0
#> 17 2019 0 0 0 0
#> 18 2020 83.6 83.6 83.6 83.6
#> # … with 1 more variable: `Caudal (m^3/s) pct NA` <dbl>
Good level data at Picota from 2003 to 2017, except for in 2015. The “flow” data is not useful though.
Station 2: BIAVO (221804)
dat_audit[[2]] %>% filter_at(2:ncol(.), any_vars(. < 100)) %>% print(n = 50)
#> # A tibble: 39 x 6
#> Year `Nivel06 (m) pc… `Nivel10 (m) pc… `Nivel14 (m) pc… `Nivel18 (m) pc…
#> <int> <dbl> <dbl> <dbl> <dbl>
#> 1 1969 0 100 100 0
#> 2 1970 16.7 41.4 41.4 16.7
#> 3 1971 16.7 16.7 16.7 16.7
#> 4 1972 0 0 0 0
#> 5 1973 0 0 0 0
#> 6 1974 0 0 0 0
#> 7 1975 2.74 2.74 2.74 2.74
#> 8 1976 16.9 16.9 16.9 16.9
#> 9 1977 67.9 67.9 67.9 67.9
#> 10 1978 5.21 5.21 4.66 4.66
#> 11 1979 21.1 21.1 21.1 21.1
#> 12 1993 69.9 69.9 69.9 69.9
#> 13 1994 0.548 0.548 0.548 0.548
#> 14 1995 0 0 0 0
#> 15 1996 0 0 0 0
#> 16 1997 0 0 0 0
#> 17 1998 1.37 0 0 0
#> 18 1999 0 0 0 0
#> 19 2000 0 0 0 0
#> 20 2001 0 0 0 0
#> 21 2002 0 0 0 0
#> 22 2003 0 0 0 0
#> 23 2004 0 0 0 0
#> 24 2005 0 0 0 0
#> 25 2006 0 0 0 0
#> 26 2007 0 0 0 0
#> 27 2008 0 0 0 0
#> 28 2009 0 0 0 0
#> 29 2010 0 0 0 0
#> 30 2011 0 0 0 0
#> 31 2012 0 0 0 0
#> 32 2013 0 0 0 0
#> 33 2014 0 0 0 0
#> 34 2015 75.3 75.3 75.3 75.3
#> 35 2016 0 0 0 0
#> 36 2017 25.2 25.2 25.2 25.2
#> 37 2018 67.1 67.1 67.1 67.1
#> 38 2019 0 0 0 0
#> 39 2020 83.6 83.6 83.6 83.6
#> # … with 1 more variable: `Caudal (m^3/s) pct NA` <dbl>
We have some data for Biavo in the 1970s, but the data becomes most useful in the mid 90s. Some data is missing in 2015 and 2017. We have both river level and discharge here.
Station 3: HUAYABAMBA (230504)
dat_audit[[3]] %>% filter_at(2:ncol(.), any_vars(. < 100)) %>% print(n = 50)
#> # A tibble: 16 x 6
#> Year `Nivel06 (m) pc… `Nivel10 (m) pc… `Nivel14 (m) pc… `Nivel18 (m) pc…
#> <int> <dbl> <dbl> <dbl> <dbl>
#> 1 2005 8.22 8.22 16.4 8.22
#> 2 2006 24.9 24.9 24.9 24.9
#> 3 2007 16.2 16.2 16.2 16.2
#> 4 2008 0 0 0 0
#> 5 2009 0 0 0 0
#> 6 2010 0 0 0 0
#> 7 2011 0 0 0 0
#> 8 2012 0 0 0 0
#> 9 2013 0 0 0 0
#> 10 2014 0 0 0 0
#> 11 2015 75.3 75.3 75.3 75.3
#> 12 2016 0 0 0 0
#> 13 2017 0 0 0 0
#> 14 2018 0 0 0 0
#> 15 2019 0 0 0 0
#> 16 2020 83.6 83.6 83.6 83.6
#> # … with 1 more variable: `Caudal (m^3/s) pct NA` <dbl>
Huayabamba is really only useful as of 2008 or so, but 2005 through 2007 may contain some useful data. River level is present. Not much discharge data.
Station 4: CAMPANILLA (221821)
dat_audit[[4]] %>% filter_at(2:ncol(.), any_vars(. < 100)) %>% print(n = 50)
#> # A tibble: 23 x 6
#> Year `Nivel06 (m) pc… `Nivel10 (m) pc… `Nivel14 (m) pc… `Nivel18 (m) pc…
#> <int> <dbl> <dbl> <dbl> <dbl>
#> 1 1998 41.4 41.4 41.4 41.4
#> 2 1999 0 0 0 0
#> 3 2000 0.273 0.273 0.273 0.273
#> 4 2001 0 0 0 0
#> 5 2002 0 0 0 0
#> 6 2003 0 0 0 0
#> 7 2004 0 0 0 0
#> 8 2005 0 0 0 0
#> 9 2006 8.49 8.49 8.49 8.49
#> 10 2007 16.2 16.2 16.2 16.2
#> 11 2008 0 0 0 0
#> 12 2009 0 0 0 0
#> 13 2010 0 0 0 0
#> 14 2011 0 0 0 0
#> 15 2012 0 0 0 0
#> 16 2013 0 0 0 0
#> 17 2014 33.7 33.7 33.7 33.7
#> 18 2015 75.3 75.3 75.3 75.3
#> 19 2016 33.3 33.3 33.3 36.3
#> 20 2017 0 0 0 0
#> 21 2018 0 0 0 0
#> 22 2019 0 0 0 0
#> 23 2020 83.6 83.6 83.6 83.6
#> # … with 1 more variable: `Caudal (m^3/s) pct NA` <dbl>
Campanilla has data from 1998 through 2017, but there is some patchiness that makes this station less useful to me. Again, very little discharge data.
Station 5: CHAZUTA (230601)
dat_audit[[5]] %>% filter_at(2:ncol(.), any_vars(. < 100)) %>% print(n = 50)
#> # A tibble: 18 x 6
#> Year `Nivel06 (m) pc… `Nivel10 (m) pc… `Nivel14 (m) pc… `Nivel18 (m) pc…
#> <int> <dbl> <dbl> <dbl> <dbl>
#> 1 2003 81.4 81.4 81.4 81.4
#> 2 2004 0 0 0 0
#> 3 2005 32.9 16.7 16.7 16.7
#> 4 2006 24.9 24.9 24.9 24.9
#> 5 2007 16.2 16.2 16.2 16.2
#> 6 2008 0 0 0 0
#> 7 2009 0 0 0 0
#> 8 2010 0 0 0 0
#> 9 2011 0 0 0 0
#> 10 2012 0 0 0 0
#> 11 2013 0 0 0 0
#> 12 2014 0 0 0 0
#> 13 2015 75.3 75.3 75.3 75.3
#> 14 2016 75.1 75.1 75.1 75.1
#> 15 2017 0 0 0 0
#> 16 2018 0 0 0 0
#> 17 2019 8.49 8.49 8.49 8.49
#> 18 2020 83.6 83.6 83.6 83.6
#> # … with 1 more variable: `Caudal (m^3/s) pct NA` <dbl>
Last, and actually least, is Chazuta. Chazuta isn’t interesting for my analysis in San Rafael, but I did do some interviews in Chazuta, which will inform my wider research. The station is similar in total length to Picota, but has some years with much missing data. No discharge data is available.
Data cleaning
The Senamhi website states in a number of places that their data have not undergone quality control. This is apparent in the data, so my first step is data cleaning. I have written functions to clean up some common errors in temperature data in the senamhiR
package, but I have yet to extend these functions to precipitation or river data. As such, I’ll have to do things manually for this post. Including all of the charts will get a bit cluttered, so I’ll run through just one example and then correct the rest.
As we can see, there are two outliers at Picota.
plot_data <- dat[[1]] %>% select(-matches("Caudal")) %>% gather(key = Time, value = Level, -Fecha)
plot_ly(data = plot_data, x = ~Fecha, y = ~Level, color = ~Time) %>% add_markers()
We can look at these two points within the context of nearby points. For instance, how about the low point for level at 6 pm (1.83 m). The river level three days before and after that point is shown below.
dat[[1]]$`Nivel18 (m)`[which.min(dat[[1]]$`Nivel18 (m)`) + -3:3]
#> [1] 16.20 15.98 15.79 1.83 16.52 16.53 16.88
I can’t be sure, but it looks like we have a decimal place shift. If I adjust this point to 18.3, the difference between that point and the average for 30 days forward and backward (16.42) is 1.9, which falls within 0.91 standard deviations of the daily values for the same period (2.08). I can be fairly sure, therefore, that 18.3 m is not an unrealistic level. I’ll go ahead and adjust that point to 18.3 m.
dat[[1]]$`Nivel18 (m)`[which.min(dat[[1]]$`Nivel18 (m)`)] <- 18.3
The same cannot be said for the low point for the level at 2 pm. That point (12.2 m) seems to be erroneous given the context of three days before and after, but isn’t likely to be a missing decimal place.
dat[[1]]$`Nivel14 (m)`[which.min(dat[[1]]$`Nivel14 (m)`) + -3:3]
#> [1] 17.05 16.88 17.46 12.20 17.60 17.34 17.20
I’ll have to set that point to missing.
dat[[1]]$`Nivel14 (m)`[which.min(dat[[1]]$`Nivel14 (m)`)] <- NA
Those two adjustments seem to take care of the data at Picota.
plot_data <- dat[[1]] %>% select(-matches("Caudal")) %>% gather(key = Time, value = Level, -Fecha)
plot_ly(data = plot_data, x = ~Fecha, y = ~Level, color = ~Time) %>% add_markers()
Now I can adjust the rest of the stations using a similar process, which I intend to automate in senamhiR
in the future.
Biavo has six points that look to be decimal place errors. I am more certain about these, because they appear to lack precision, that is, all of the other measurements are measured to two decimal places, but these are only measured to one, meaning that 20.8 m was likely supposed to be 2.08 m.
dat[[2]]$`Nivel06 (m)`[c(11940, 13890)] <- 2.08 # was 20.8
dat[[2]]$`Nivel10 (m)`[10885] <- 2.08 # was 20.8
dat[[2]]$`Nivel10 (m)`[13460] <- 2.04 # was 20.4
dat[[2]]$`Nivel14 (m)`[13583] <- 2.05 # was 20.5
dat[[2]]$`Nivel14 (m)`[10008] <- 2.02 # was 20.2
dat[[2]]$`Nivel18 (m)`[13750] <- 2.04 # was 20.4
The other stations are cleaner.
dat[[3]]$`Nivel14 (m)`[2964] <- 10.12 # was 1012
dat[[4]]$`Nivel06 (m)`[4267] <- 9.52 # was 952
dat[[5]]$`Nivel10 (m)`[3940] <- 12.08 # was 1208
Questioning Biavo
I am unsure whether Biavo is interesting to me. The default OpenStreetMap tiles used in the above map do not show the stream at Biavo connecting to the Huallaga. However, it could be that the tiles are not very complete. Luckily, EOX IT Services GmbH have created a
cloud-free satellite mapping layer and released it as open data. I have added an option to the senamhiR
package to use this imagery in the
map_stations()
function. On the map below, one can pan from Biavo down to the Huallaga. Biavo appears to be a small first-order tributary to the Huallaga, with lots of agricultural land after the river gauge and before the Huallaga, as such, I don’t have a very good idea of whether Biavo will be a good proxy.
# This block won't run because it addAwesomeMarkers doesn't seem to work in hugodown
map_stations(hstations_filtered, type = "sentinel")
Let’s look at the relationship between flow at Biavo and flow at Picota. The Senamhi river data is collected at four-hour intervals from 6 am to 6 pm. I am more interested understanding extremes, so I’ll look at mean, maximum and minimum level on a given calendar day. I’ll just use the average level for this post.
dat <- collapse_pcd(dat)
dat <- dat %>%
mutate(avg_lvl = rowMeans(select(dat, 3:6))) %>% rowwise() %>%
mutate(max_lvl = max(`Nivel06 (m)`, `Nivel10 (m)`, `Nivel14 (m)`, `Nivel18 (m)`),
min_lvl = min(`Nivel06 (m)`, `Nivel10 (m)`, `Nivel14 (m)`, `Nivel18 (m)`)) %>%
select(-3:-7)
Now we can plot Biavo against Picota and perform a quick linear regression.
plot_data <- filter(dat, StationID %in% c("230715", "221804")) %>% select(Fecha, StationID, avg_lvl) %>% spread(StationID, avg_lvl)
plot_ly(data = plot_data, x = ~`230715`, y = ~`221804`) %>% add_markers() %>%
layout(xaxis = list(title = "Picota"), yaxis = list(title = "Biavo"))
fit <- lm(plot_data$`221804`~plot_data$`230715`)
summary(fit)
#>
#> Call:
#> lm(formula = plot_data$`221804` ~ plot_data$`230715`)
#>
#> Residuals:
#> Min 1Q Median 3Q Max
#> -5.924 -0.494 -0.095 0.388 3.139
#>
#> Coefficients:
#> Estimate Std. Error t value Pr(>|t|)
#> (Intercept) 1.83078 0.02506 73.1 <2e-16 ***
#> plot_data$`230715` 0.01535 0.00144 10.7 <2e-16 ***
#> ---
#> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#>
#> Residual standard error: 0.641 on 5654 degrees of freedom
#> (13337 observations deleted due to missingness)
#> Multiple R-squared: 0.0197, Adjusted R-squared: 0.0195
#> F-statistic: 114 on 1 and 5654 DF, p-value: <2e-16
There certainly seems to be a relationship between the average daily river level at Picota and that at Biavo. I guess I’ll keep Biavo after all!
Plotting river level and flood windows
Upstream of Picota, I have three stations (Biavo, Huayabamba, and Campanilla). Chazuta is on a tributary downstream of Picota. It will be the subject of a separate analysis. A review of INDECI emergency reports, as well as information from interview informants has given me a few windows in which I know flooding has occurred in San Rafael and surrounding areas:
- 2006-11 in las Flores (Libertad)
- 2013-01-23 (from interview and INDECI reports)
- sometime between 2015-01-22 and 2015-01-24 (from INDECI and interviews)
- 2015-12-01 (from INDECI reports)
- 2017-02 (interviewees reported a small flood, but there is no INDECI report)
- sometime between 2017-11-02 and 2017-11-14 (widespread flooding, INDECI)
I’ll highlight those months on a plot. I’ll also mark February through March and August, which represent the “hot points” for floods and droughts, respectively, as per my interview participants.
highlight <- annotate("rect",
xmin = as.Date(c("2006-11-01",
"2013-01-01",
"2015-01-01",
"2015-12-01",
"2017-02-01",
"2017-11-01")),
xmax = as.Date(c("2006-11-30",
"2013-01-31",
"2015-01-31",
"2015-12-31",
"2017-02-28",
"2017-11-30")),
ymin = -Inf, ymax = Inf, alpha = 0.2, fill = "blue")
plot_data <- dat %>% filter(Fecha >= "2003-01-01" & Fecha <= "2017-12-31" & StationID != "230601") %>%
mutate(Risk = case_when(format(Fecha, format = "%m") %in% c("02", "03") ~ "flood",
format(Fecha, format = "%m") == "08" ~ "dry",
TRUE ~ "none"))
Let’s take a look. Unfortunately, this is going to be a non-interactive graph because Plotly doesn’t handle some of the formatting very well.
ggplot(data = plot_data) +
geom_point(aes(x = Fecha, y = avg_lvl, colour = Risk)) +
scale_colour_manual(values = c("darkred", "darkblue", "black")) +
highlight +
facet_wrap(~StationID, nrow = 4, scales = "free_y") +
ylab("Average River Level (m)")
Preliminary observations
There are some interesting patterns to note:
- Two of my upstream stations (Biavo and Huayabamba) appear to have a period of data missing during and after the November 2006 flood. It may be interesting to see how the precipitation data during this period looks. It is understandable that flooding can lead to data gaps.
- All of my stations are missing a big chunk of data in 2015, including the period that corresponds to the December 2015 flood. I am curious to figure out what happened during that time. Was it the flood itself that spurred the re-activation of these stations?
- Many of the flood events reported do not occur during the blue “flood risk” months. I wonder whether my interviewees were misremembering, or if perhaps INDECI has reports on the “out of season” floods, but not the smaller-scale year-after-year types of flash floods.
- Campanilla shows high levels during at least three of the flood “windows”, but no stations shows consistent extremes over all windows.
- There are points at all four stations that seem to correspond to flood-level events, but that do not appear in INDECI reports or my interview results.
Next steps
My next steps will be to try to establish a relationship between regional precipitation and the river level. I think I will have to add some more meteorological stations, based on the juxtaposition of the station to my river gauges. I need to capture precipitation near the gauges, as well as upstream of them. That will be the subject for another post.
This post was compiled on 2020-10-09 18:49:18. Since that time, there may have been changes to the packages that were used in this post. If you can no longer use this code, please notify the author in the comments below.
Packages Used in this post
sessioninfo::package_info(dependencies = "Depends")
#> package * version date lib source
#> assertthat 0.2.1 2019-03-21 [1] RSPM (R 4.0.0)
#> cli 2.0.2 2020-02-28 [1] RSPM (R 4.0.0)
#> colorspace 1.4-1 2019-03-18 [1] RSPM (R 4.0.0)
#> crayon 1.3.4 2017-09-16 [1] RSPM (R 4.0.0)
#> crosstalk 1.1.0.1 2020-03-13 [1] RSPM (R 4.0.0)
#> curl 4.3 2019-12-02 [1] RSPM (R 4.0.0)
#> data.table 1.13.0 2020-07-24 [1] RSPM (R 4.0.2)
#> digest 0.6.25 2020-02-23 [1] RSPM (R 4.0.0)
#> downlit 0.2.0 2020-09-25 [1] RSPM (R 4.0.2)
#> dplyr * 1.0.2 2020-08-18 [1] RSPM (R 4.0.2)
#> ellipsis 0.3.1 2020-05-15 [1] RSPM (R 4.0.0)
#> evaluate 0.14 2019-05-28 [1] RSPM (R 4.0.0)
#> fansi 0.4.1 2020-01-08 [1] RSPM (R 4.0.0)
#> farver 2.0.3 2020-01-16 [1] RSPM (R 4.0.0)
#> fs 1.5.0 2020-07-31 [1] RSPM (R 4.0.2)
#> generics 0.0.2 2018-11-29 [1] RSPM (R 4.0.0)
#> geosphere 1.5-10 2019-05-26 [1] RSPM (R 4.0.0)
#> ggplot2 * 3.3.2 2020-06-19 [1] RSPM (R 4.0.1)
#> glue 1.4.2 2020-08-27 [1] RSPM (R 4.0.2)
#> gtable 0.3.0 2019-03-25 [1] RSPM (R 4.0.0)
#> htmltools 0.5.0 2020-06-16 [1] RSPM (R 4.0.1)
#> htmlwidgets 1.5.1 2019-10-08 [1] RSPM (R 4.0.0)
#> httr 1.4.2 2020-07-20 [1] RSPM (R 4.0.2)
#> hugodown 0.0.0.9000 2020-10-08 [1] Github (r-lib/hugodown@18911fc)
#> jsonlite 1.7.1 2020-09-07 [1] RSPM (R 4.0.2)
#> knitr 1.30 2020-09-22 [1] RSPM (R 4.0.2)
#> labeling 0.3 2014-08-23 [1] RSPM (R 4.0.0)
#> lattice 0.20-41 2020-04-02 [1] RSPM (R 4.0.0)
#> lazyeval 0.2.2 2019-03-15 [1] RSPM (R 4.0.0)
#> lifecycle 0.2.0 2020-03-06 [1] RSPM (R 4.0.0)
#> magrittr 1.5 2014-11-22 [1] RSPM (R 4.0.0)
#> munsell 0.5.0 2018-06-12 [1] RSPM (R 4.0.0)
#> pillar 1.4.6 2020-07-10 [1] RSPM (R 4.0.2)
#> pkgconfig 2.0.3 2019-09-22 [1] RSPM (R 4.0.0)
#> plotly * 4.9.2.1 2020-04-04 [1] RSPM (R 4.0.0)
#> purrr 0.3.4 2020-04-17 [1] RSPM (R 4.0.0)
#> R6 2.4.1 2019-11-12 [1] RSPM (R 4.0.0)
#> RColorBrewer 1.1-2 2014-12-07 [1] RSPM (R 4.0.0)
#> rlang 0.4.7 2020-07-09 [1] RSPM (R 4.0.2)
#> rmarkdown 2.3 2020-06-18 [1] RSPM (R 4.0.1)
#> scales 1.1.1 2020-05-11 [1] RSPM (R 4.0.0)
#> senamhiR * 0.7.2 2020-10-01 [1] gitlab (ConorIA/senamhiR@b75a2c7)
#> sessioninfo 1.1.1 2018-11-05 [1] RSPM (R 4.0.0)
#> sp 1.4-2 2020-05-20 [1] RSPM (R 4.0.0)
#> stringi 1.5.3 2020-09-09 [1] RSPM (R 4.0.2)
#> stringr 1.4.0 2019-02-10 [1] RSPM (R 4.0.0)
#> tibble 3.0.3 2020-07-10 [1] RSPM (R 4.0.2)
#> tidyr * 1.1.2 2020-08-27 [1] RSPM (R 4.0.2)
#> tidyselect 1.1.0 2020-05-11 [1] RSPM (R 4.0.0)
#> utf8 1.1.4 2018-05-24 [1] RSPM (R 4.0.0)
#> vctrs 0.3.4 2020-08-29 [1] RSPM (R 4.0.2)
#> viridisLite 0.3.0 2018-02-01 [1] RSPM (R 4.0.0)
#> withr 2.3.0 2020-09-22 [1] RSPM (R 4.0.2)
#> xfun 0.18 2020-09-29 [2] RSPM (R 4.0.2)
#> yaml 2.2.1 2020-02-01 [1] RSPM (R 4.0.0)
#> zoo 1.8-8 2020-05-02 [1] RSPM (R 4.0.0)
#>
#> [1] /home/conor/Library
#> [2] /usr/local/lib/R/site-library
#> [3] /usr/local/lib/R/library