From 512846c202887995223ce6e2bb172dbcd9cc86ca Mon Sep 17 00:00:00 2001 From: Glenda Yenni Date: Fri, 26 Apr 2019 11:31:35 -0600 Subject: [PATCH 01/35] Summarize bbs regions by year --- R/get_retriever_data.R | 39 +++++++++++++++++++++++++++------------ man/get_bbs_data.Rd | 2 +- 2 files changed, 28 insertions(+), 13 deletions(-) diff --git a/R/get_retriever_data.R b/R/get_retriever_data.R index 2a27e64..45a3ab2 100644 --- a/R/get_retriever_data.R +++ b/R/get_retriever_data.R @@ -16,7 +16,7 @@ #' #' @examples #' \dontrun{ -#' get_bbs_data(bbs_data_tables=retriever_data()$'breed-bird-survey',region=7) +#' get_bbs_data(region=7) #' } #' @export @@ -31,26 +31,41 @@ get_bbs_data <- function(start_yr = 1965, end_yr = 2017, min_num_yrs = 10, regio by = c('statenum', 'route', 'rpid', 'year', 'routedataid', 'countrynum')) %>% dplyr::left_join(bbs_data_tables$breed_bird_survey_routes, by = c('statenum', 'route', 'countrynum')) %>% - dplyr::filter(statenum == region) %>% - dplyr::mutate(site_id = statenum*1000 + route) %>% + dplyr::filter(bcr == region) %>% + dplyr::mutate(site_id = statenum*1000 + route, + starttemp = dplyr::case_when(tempscale=='F' ~ c((starttemp - 32)*5/9), + tempscale=='C' ~ as.double(starttemp)), + endtemp = dplyr::case_when(tempscale=='F' ~ c((endtemp - 32)*5/9), + tempscale=='C' ~ as.double(endtemp))) %>% dplyr::rename(lat = latitude, long = longitude, species_id = aou, abundance = speciestotal) %>% - dplyr::mutate(species_id = paste('sp', species_id,sep='')) %>% + dplyr::mutate(species_id = paste('sp', species_id, sep=''), + date = as.Date(paste(year, month, day, sep = "-"))) %>% filter_ts(start_yr, end_yr, min_num_yrs) %>% - dplyr::ungroup() %>% - dplyr::select(-rpid, -runtype, -count10, -count20, -count30, -count40, -count50) %>% - tidyr::spread(key = species_id, value = abundance, fill = 0) + dplyr::ungroup() abundance <- bbs_data %>% - dplyr::select(dplyr::starts_with('sp')) + dplyr::group_by(year, species_id) %>% + dplyr::summarise(abundance = sum(abundance)) %>% + dplyr::ungroup() %>% + tidyr::spread(key = species_id, value = abundance, fill = 0) %>% + dplyr::arrange(year) %>% + dplyr::select(-year) covariates <- bbs_data %>% - dplyr::select(-dplyr::starts_with('sp')) - covariates$date <- as.Date(paste(covariates$year, covariates$month, covariates$day, sep = "-") ) - metadata <- list(timename = "date", effort = NULL) - return(list('abundance' = abundance, 'covariates' = covariates, "metadata" = metadata)) + dplyr::group_by(year) %>% + dplyr::summarise(effort = dplyr::n_distinct(site_id), + starttemp = mean(starttemp), endtemp = mean(endtemp), + startwind = mean(startwind), endwind = mean(endwind), + startsky = mean(startsky), endsky = mean(endsky), + lat = mean(lat), long = mean(long), mean_date = mean(date)) %>% + dplyr::arrange(year) + + metadata <- list(timename = 'year', effort = 'effort') + + return(list('abundance' = abundance, 'covariates' = covariates, 'metadata' = metadata)) } #' @title Filter BBS to specified time series period and number of samples diff --git a/man/get_bbs_data.Rd b/man/get_bbs_data.Rd index 6e690b4..4dd1257 100644 --- a/man/get_bbs_data.Rd +++ b/man/get_bbs_data.Rd @@ -30,6 +30,6 @@ samples during that period. } \examples{ \dontrun{ - get_bbs_data(bbs_data_tables=retriever_data()$'breed-bird-survey',region=7) + get_bbs_data(region=7) } } From b69f9eb68d60efe29f4ec18cba34adaf5f2b0aff Mon Sep 17 00:00:00 2001 From: Renata Diaz Date: Fri, 10 May 2019 10:44:58 -0400 Subject: [PATCH 02/35] Filter by route and add region, route to covariates table --- R/get_retriever_data.R | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/R/get_retriever_data.R b/R/get_retriever_data.R index 45a3ab2..45a84b7 100644 --- a/R/get_retriever_data.R +++ b/R/get_retriever_data.R @@ -9,6 +9,7 @@ #' @param end_yr num last year of time-series #' @param min_num_yrs num minimum number of years of data between start_yr & end_yr #' @param region region code of data to return (currently uses state codes) +#' @param this_route which route within that region #' @inheritParams get_mtquad_data #' #' @return list of two dataframes (one with abundance data, the other with covariate data) @@ -20,7 +21,7 @@ #' } #' @export -get_bbs_data <- function(start_yr = 1965, end_yr = 2017, min_num_yrs = 10, region, +get_bbs_data <- function(start_yr = 1965, end_yr = 2017, min_num_yrs = 10, region, this_route, path = get_default_data_path()) { bbs_data_tables <- import_retriever_data("breed-bird-survey", path = path) @@ -31,7 +32,7 @@ get_bbs_data <- function(start_yr = 1965, end_yr = 2017, min_num_yrs = 10, regio by = c('statenum', 'route', 'rpid', 'year', 'routedataid', 'countrynum')) %>% dplyr::left_join(bbs_data_tables$breed_bird_survey_routes, by = c('statenum', 'route', 'countrynum')) %>% - dplyr::filter(bcr == region) %>% + dplyr::filter(bcr == region, route == this_route) %>% dplyr::mutate(site_id = statenum*1000 + route, starttemp = dplyr::case_when(tempscale=='F' ~ c((starttemp - 32)*5/9), tempscale=='C' ~ as.double(starttemp)), @@ -61,6 +62,7 @@ get_bbs_data <- function(start_yr = 1965, end_yr = 2017, min_num_yrs = 10, regio startwind = mean(startwind), endwind = mean(endwind), startsky = mean(startsky), endsky = mean(endsky), lat = mean(lat), long = mean(long), mean_date = mean(date)) %>% + dplyr::mutate(route = this_route, region = region) %>% dplyr::arrange(year) metadata <- list(timename = 'year', effort = 'effort') From 87172de8bc48d9015d2462faa6a367cdfa579c2f Mon Sep 17 00:00:00 2001 From: Renata Diaz Date: Fri, 10 May 2019 12:13:58 -0400 Subject: [PATCH 03/35] Clean bbs data and subset at route level --- NAMESPACE | 16 +++++++++ R/bbs_cleaning_functions.R | 69 ++++++++++++++++++++++++++++++++++++++ R/get_retriever_data.R | 2 ++ man/combine_subspecies.Rd | 11 ++++++ man/filter_bbs_species.Rd | 24 +++++++++++++ man/get_bbs_data.Rd | 4 ++- man/summarize_vec.Rd | 27 --------------- 7 files changed, 125 insertions(+), 28 deletions(-) create mode 100644 R/bbs_cleaning_functions.R create mode 100644 man/combine_subspecies.Rd create mode 100644 man/filter_bbs_species.Rd delete mode 100644 man/summarize_vec.Rd diff --git a/NAMESPACE b/NAMESPACE index 1180946..9d583fe 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -34,6 +34,21 @@ export(ts_summary) export(ts_summary_drake) export(uni_ts_summary) export(use_default_data_path) +importFrom(dplyr,"%>%") +importFrom(dplyr,do) +importFrom(dplyr,filter) +importFrom(dplyr,full_join) +importFrom(dplyr,group_by) +importFrom(dplyr,inner_join) +importFrom(dplyr,left_join) +importFrom(dplyr,n_distinct) +importFrom(dplyr,pull) +importFrom(dplyr,rowwise) +importFrom(dplyr,select) +importFrom(dplyr,semi_join) +importFrom(dplyr,slice) +importFrom(dplyr,summarise) +importFrom(dplyr,ungroup) importFrom(graphics,axis) importFrom(graphics,mtext) importFrom(graphics,par) @@ -49,6 +64,7 @@ importFrom(stats,median) importFrom(stats,na.omit) importFrom(stats,sd) importFrom(stats,setNames) +importFrom(stringr,word) importFrom(utils,data) importFrom(utils,read.csv) importFrom(utils,read.delim) diff --git a/R/bbs_cleaning_functions.R b/R/bbs_cleaning_functions.R new file mode 100644 index 0000000..011b1fb --- /dev/null +++ b/R/bbs_cleaning_functions.R @@ -0,0 +1,69 @@ +#' Filter poorly sampled BBS species +#' +#' Modified from https://github.com/weecology/bbs-forecasting/blob/master/R/forecast-bbs-core.R +#' +#' Removes waterbirds, shorebirds, owls, kingfishers, knightjars, +#' dippers. These species are poorly sampled due to their aquatic or +#' noctural nature. Also removes taxa that were either partially unidentified +#' (e.g. "sp.") or were considered hybrids (e.g. "A x B") or were listed as more +#' than one species (e.g. "A / B") +#' +#' @param df dataframe containing an species_id column +#' +#' @return dataframe, filtered version of initial dataframe +#' @importFrom dplyr "%>%" inner_join do rowwise select filter group_by ungroup full_join n_distinct semi_join left_join +filter_bbs_species <- function(df, species_table){ + + is_unidentified = function(names) { + #Before filtering, account for this one hybrid of 2 subspecies so it's kept + names[names=='auratus auratus x auratus cafer']='auratus auratus' + grepl('sp\\.| x |\\/', names) + } + + valid_taxa = species_table %>% + dplyr:: filter(!is_unidentified(species)) %>% + dplyr::filter(aou > 2880) %>% + dplyr::filter(aou < 3650 | aou > 3810) %>% + dplyr::filter(aou < 3900 | aou > 3910) %>% + dplyr::filter(aou < 4160 | aou > 4210) %>% + dplyr::filter(aou != 7010) + + dplyr::filter(df, species_id %in% valid_taxa$aou) +} + +#' Combine subspecies into their common species +#' +#' Modified from https://github.com/weecology/bbs-forecasting/blob/master/R/forecast-bbs-core.R +#' +#' @importFrom dplyr "%>%" filter slice group_by summarise ungroup pull +#' @importFrom stringr word +combine_subspecies = function(df, species_table){ + + # Subspecies have two spaces separated by non-spaces + subspecies_names = species_table %>% + dplyr::filter(aou %in% unique(df$species_id)) %>% + dplyr::pull(spanish_common_name) %>% + grep(" [^ ]+ ", ., value = TRUE) + + subspecies_ids = species_table %>% + dplyr::filter(spanish_common_name %in% subspecies_names) %>% + dplyr::pull(aou) + + # Drop all but the first two words to get the root species name, + # then find the AOU code + new_subspecies_ids = species_table %>% + dplyr::slice(match(stringr::word(subspecies_names, 1,2), + species_table$spanish_common_name)) %>% + dplyr::pull(aou) + + # replace the full subspecies names with species-level names + for (i in seq_along(subspecies_ids)) { + df$species_id[df$species_id == subspecies_ids[i]] = new_subspecies_ids[i] + } + + df_grouped <- df %>% + dplyr::group_by_at(dplyr::vars(-abundance)) %>% + dplyr::summarise(abundance = sum(abundance)) %>% + dplyr::ungroup() %>% + dplyr::distinct() +} \ No newline at end of file diff --git a/R/get_retriever_data.R b/R/get_retriever_data.R index 45a84b7..8578580 100644 --- a/R/get_retriever_data.R +++ b/R/get_retriever_data.R @@ -42,6 +42,8 @@ get_bbs_data <- function(start_yr = 1965, end_yr = 2017, min_num_yrs = 10, regio long = longitude, species_id = aou, abundance = speciestotal) %>% + combine_subspecies(species_table = bbs_data_tables$breed_bird_survey_species) %>% + filter_bbs_species(species_table = bbs_data_tables$breed_bird_survey_species) %>% dplyr::mutate(species_id = paste('sp', species_id, sep=''), date = as.Date(paste(year, month, day, sep = "-"))) %>% filter_ts(start_yr, end_yr, min_num_yrs) %>% diff --git a/man/combine_subspecies.Rd b/man/combine_subspecies.Rd new file mode 100644 index 0000000..a17287c --- /dev/null +++ b/man/combine_subspecies.Rd @@ -0,0 +1,11 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/bbs_cleaning_functions.R +\name{combine_subspecies} +\alias{combine_subspecies} +\title{Combine subspecies into their common species} +\usage{ +combine_subspecies(df, species_table) +} +\description{ +Modified from https://github.com/weecology/bbs-forecasting/blob/master/R/forecast-bbs-core.R +} diff --git a/man/filter_bbs_species.Rd b/man/filter_bbs_species.Rd new file mode 100644 index 0000000..9d74bd7 --- /dev/null +++ b/man/filter_bbs_species.Rd @@ -0,0 +1,24 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/bbs_cleaning_functions.R +\name{filter_bbs_species} +\alias{filter_bbs_species} +\title{Filter poorly sampled BBS species} +\usage{ +filter_bbs_species(df, species_table) +} +\arguments{ +\item{df}{dataframe containing an species_id column} +} +\value{ +dataframe, filtered version of initial dataframe +} +\description{ +Modified from https://github.com/weecology/bbs-forecasting/blob/master/R/forecast-bbs-core.R +} +\details{ +Removes waterbirds, shorebirds, owls, kingfishers, knightjars, +dippers. These species are poorly sampled due to their aquatic or +noctural nature. Also removes taxa that were either partially unidentified +(e.g. "sp.") or were considered hybrids (e.g. "A x B") or were listed as more +than one species (e.g. "A / B") +} diff --git a/man/get_bbs_data.Rd b/man/get_bbs_data.Rd index 4dd1257..5c0ef6f 100644 --- a/man/get_bbs_data.Rd +++ b/man/get_bbs_data.Rd @@ -5,7 +5,7 @@ \title{Create BBS population time-series data} \usage{ get_bbs_data(start_yr = 1965, end_yr = 2017, min_num_yrs = 10, - region, path = get_default_data_path()) + region, this_route, path = get_default_data_path()) } \arguments{ \item{start_yr}{num first year of time-series} @@ -16,6 +16,8 @@ get_bbs_data(start_yr = 1965, end_yr = 2017, min_num_yrs = 10, \item{region}{region code of data to return (currently uses state codes)} +\item{this_route}{which route within that region} + \item{path}{where to load the raw data files from} } \value{ diff --git a/man/summarize_vec.Rd b/man/summarize_vec.Rd deleted file mode 100644 index 7a0d681..0000000 --- a/man/summarize_vec.Rd +++ /dev/null @@ -1,27 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/summary_stats.R -\name{summarize_vec} -\alias{summarize_vec} -\title{summarize_vec is a helper function that handles the work of - \code{\link{summarize_obs}}, \code{\link{summarize_time}}, and - \code{\link{summarize_effort}}} -\usage{ -summarize_vec(obs, x, round_out = TRUE, digits = NULL) -} -\arguments{ -\item{obs}{\code{numeric} vector of observations.} - -\item{x}{the vector to be summarized} - -\item{round_out}{\code{logical} indicator if rounding should happen.} - -\item{digits}{\code{NULL} (default) or \code{integer} value of the number -of digits for rounding. If \code{NULL}, \code{digits} is calculated to -be two order of magnitude lower than the smallest value in the vector -being summarized.} -} -\description{ -summarize_vec is a helper function that handles the work of - \code{\link{summarize_obs}}, \code{\link{summarize_time}}, and - \code{\link{summarize_effort}} -} From 7cb0db81ea6c90f9fa1f68e2e47458a1f0d87694 Mon Sep 17 00:00:00 2001 From: Renata Diaz Date: Fri, 10 May 2019 12:24:14 -0400 Subject: [PATCH 04/35] Clean up imports in NAMESPACE --- NAMESPACE | 16 ---------------- R/bbs_cleaning_functions.R | 4 +--- 2 files changed, 1 insertion(+), 19 deletions(-) diff --git a/NAMESPACE b/NAMESPACE index 9d583fe..1180946 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -34,21 +34,6 @@ export(ts_summary) export(ts_summary_drake) export(uni_ts_summary) export(use_default_data_path) -importFrom(dplyr,"%>%") -importFrom(dplyr,do) -importFrom(dplyr,filter) -importFrom(dplyr,full_join) -importFrom(dplyr,group_by) -importFrom(dplyr,inner_join) -importFrom(dplyr,left_join) -importFrom(dplyr,n_distinct) -importFrom(dplyr,pull) -importFrom(dplyr,rowwise) -importFrom(dplyr,select) -importFrom(dplyr,semi_join) -importFrom(dplyr,slice) -importFrom(dplyr,summarise) -importFrom(dplyr,ungroup) importFrom(graphics,axis) importFrom(graphics,mtext) importFrom(graphics,par) @@ -64,7 +49,6 @@ importFrom(stats,median) importFrom(stats,na.omit) importFrom(stats,sd) importFrom(stats,setNames) -importFrom(stringr,word) importFrom(utils,data) importFrom(utils,read.csv) importFrom(utils,read.delim) diff --git a/R/bbs_cleaning_functions.R b/R/bbs_cleaning_functions.R index 011b1fb..6f63672 100644 --- a/R/bbs_cleaning_functions.R +++ b/R/bbs_cleaning_functions.R @@ -11,7 +11,7 @@ #' @param df dataframe containing an species_id column #' #' @return dataframe, filtered version of initial dataframe -#' @importFrom dplyr "%>%" inner_join do rowwise select filter group_by ungroup full_join n_distinct semi_join left_join + filter_bbs_species <- function(df, species_table){ is_unidentified = function(names) { @@ -35,8 +35,6 @@ filter_bbs_species <- function(df, species_table){ #' #' Modified from https://github.com/weecology/bbs-forecasting/blob/master/R/forecast-bbs-core.R #' -#' @importFrom dplyr "%>%" filter slice group_by summarise ungroup pull -#' @importFrom stringr word combine_subspecies = function(df, species_table){ # Subspecies have two spaces separated by non-spaces From 070fee73651cba7975606271b747e9507d2a98d1 Mon Sep 17 00:00:00 2001 From: Renata Diaz Date: Sun, 12 May 2019 15:15:01 -0400 Subject: [PATCH 05/35] Method for importing all BBS routes and including in drake plans --- NAMESPACE | 5 +- R/bbs_cleaning_functions.R | 3 +- R/build_plans.R | 34 +++++++++++- R/get_retriever_data.R | 60 ++++++++++++++------- man/build_bbs_datasets_plan.Rd | 18 +++++++ man/build_datasets_plan.Rd | 4 +- man/get_bbs_route_region_data.Rd | 22 ++++++++ man/{get_bbs_data.Rd => get_bbs_ts_data.Rd} | 20 ++----- 8 files changed, 126 insertions(+), 40 deletions(-) create mode 100644 man/build_bbs_datasets_plan.Rd create mode 100644 man/get_bbs_route_region_data.Rd rename man/{get_bbs_data.Rd => get_bbs_ts_data.Rd} (59%) diff --git a/NAMESPACE b/NAMESPACE index 1180946..8c3a00b 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -3,11 +3,14 @@ export("%>%") export(analysis_wrapper) export(build_analyses_plan) +export(build_bbs_datasets_plan) export(build_datasets_plan) export(check_data_format) export(check_default_data_path) export(collect_analyses) -export(get_bbs_data) +export(combine_subspecies) +export(get_bbs_route_region_data) +export(get_bbs_ts_data) export(get_cowley_lizards) export(get_cowley_snakes) export(get_default_data_path) diff --git a/R/bbs_cleaning_functions.R b/R/bbs_cleaning_functions.R index 6f63672..b58901b 100644 --- a/R/bbs_cleaning_functions.R +++ b/R/bbs_cleaning_functions.R @@ -35,6 +35,7 @@ filter_bbs_species <- function(df, species_table){ #' #' Modified from https://github.com/weecology/bbs-forecasting/blob/master/R/forecast-bbs-core.R #' +#' @export combine_subspecies = function(df, species_table){ # Subspecies have two spaces separated by non-spaces @@ -64,4 +65,4 @@ combine_subspecies = function(df, species_table){ dplyr::summarise(abundance = sum(abundance)) %>% dplyr::ungroup() %>% dplyr::distinct() -} \ No newline at end of file +} diff --git a/R/build_plans.R b/R/build_plans.R index ff00b3a..1bbfcc9 100644 --- a/R/build_plans.R +++ b/R/build_plans.R @@ -64,6 +64,7 @@ build_analyses_plan <- function(methods, datasets, ...) #' #' @param data_path where to get the downloaded retriever datasets #' @param include_downloaded_data whether to also include downloadable datasets +#' @param include_bbs_data whether to include BBS data #' #' @return a drake plan (i.e. a tibble) specifying the targets and commands #' for gathering datasets @@ -71,7 +72,8 @@ build_analyses_plan <- function(methods, datasets, ...) #' @export #' build_datasets_plan <- function(data_path = get_default_data_path(), - include_downloaded_data = FALSE) + include_downloaded_data = FALSE, + include_bbs_data = FALSE) { datasets <- drake::drake_plan( maizuru_data = get_maizuru_data(), @@ -88,11 +90,39 @@ build_datasets_plan <- function(data_path = get_default_data_path(), dplyr::bind_rows( drake::drake_plan( portal_data = get_portal_rodents(), - bbs_data = get_bbs_data(region = 7, path = !!data_path), sdl_data = get_sdl_data(path = !!data_path), mtquad_data = get_mtquad_data(path = !!data_path) ) ) } + + if (include_bbs_data) { + bbs_ts_data = get_bbs_ts_data() + bbs_datasets = build_bbs_datasets_plan(bbs_ts_data) + datasets <- datasets %>% + dplyr::bind_rows(bbs_datasets) + } + return(datasets) } + +#' @title Generate a Drake Plan for BBS Datasets +#' +#' @param data_path +#' +#' @return a drake plan (i.e. a tibble) specifying the targets and commands +#' for gathering BBS datasets +#' +#' @export +#' +build_bbs_datasets_plan <- function(bbs_ts_data) +{ + bbs_datasets <- drake::drake_plan( + bbs_data_rtrg = target(get_bbs_route_region_data(route, region, bbs_ts_data), + transform = map(route = !!rlang::syms(bbs_ts_data$routes_and_regions$route), + region = !!rlang::syms(bbs_ts_data$routes_and_regions$bcr) + ) + ) + ) + return(bbs_datasets) +} diff --git a/R/get_retriever_data.R b/R/get_retriever_data.R index 8578580..55f9a2e 100644 --- a/R/get_retriever_data.R +++ b/R/get_retriever_data.R @@ -4,25 +4,16 @@ #' and https://github.com/weecology/MATSS-community-change #' Selects sites with data spanning start_yr through end_yr containing at least min_num_yrs of data #' samples during that period. -#' #' @param start_yr num first year of time-series #' @param end_yr num last year of time-series #' @param min_num_yrs num minimum number of years of data between start_yr & end_yr -#' @param region region code of data to return (currently uses state codes) -#' @param this_route which route within that region #' @inheritParams get_mtquad_data #' -#' @return list of two dataframes (one with abundance data, the other with covariate data) -#' and one list of metadata. -#' -#' @examples -#' \dontrun{ -#' get_bbs_data(region=7) -#' } +#' @return list of three dataframes (one with bbs data filtered to time series that meet the criteria, one with the BBS species table, and one with the routes and regions represented in the first dataframe). #' @export -get_bbs_data <- function(start_yr = 1965, end_yr = 2017, min_num_yrs = 10, region, this_route, - path = get_default_data_path()) +get_bbs_ts_data <- function(start_yr = 1965, end_yr = 2017, min_num_yrs = 10, + path = get_default_data_path()) { bbs_data_tables <- import_retriever_data("breed-bird-survey", path = path) @@ -32,7 +23,6 @@ get_bbs_data <- function(start_yr = 1965, end_yr = 2017, min_num_yrs = 10, regio by = c('statenum', 'route', 'rpid', 'year', 'routedataid', 'countrynum')) %>% dplyr::left_join(bbs_data_tables$breed_bird_survey_routes, by = c('statenum', 'route', 'countrynum')) %>% - dplyr::filter(bcr == region, route == this_route) %>% dplyr::mutate(site_id = statenum*1000 + route, starttemp = dplyr::case_when(tempscale=='F' ~ c((starttemp - 32)*5/9), tempscale=='C' ~ as.double(starttemp)), @@ -42,14 +32,43 @@ get_bbs_data <- function(start_yr = 1965, end_yr = 2017, min_num_yrs = 10, regio long = longitude, species_id = aou, abundance = speciestotal) %>% - combine_subspecies(species_table = bbs_data_tables$breed_bird_survey_species) %>% - filter_bbs_species(species_table = bbs_data_tables$breed_bird_survey_species) %>% + filter_ts(start_yr, end_yr, min_num_yrs) + + + bbs_routes_regions <- bbs_data %>% + dplyr::select(bcr, route) %>% + dplyr::distinct() %>% + dplyr::mutate(bcr = as.character(bcr), route = as.character(route)) %>% + dplyr::mutate(name = paste0("bbs_bcr", bcr, "_route", route)) + + bbs_ts_data = list(bbs_data = bbs_data, species_table = bbs_data_tables$breed_bird_survey_species, routes_and_regions = bbs_routes_regions) + + return(bbs_ts_data) +} + + +#' Get BBS data by route and reigon +#' +#' @param route route +#' @param region region +#' @param bbs_ts_data list of three dataframes (output of get_bbs_ts_data) +#' @return list of two dataframes (one with abundance data, the other with covariate data) +#' and one list of metadata. +#' @export +get_bbs_route_region_data <- function(route, region, bbs_ts_data) { + + route = as.numeric(route) + region = as.numeric(region) + + this_bbs_data <- bbs_ts_data$bbs_data %>% + dplyr::filter(bcr == region, route == route) %>% + combine_subspecies(species_table = bbs_ts_data$species_table) %>% + filter_bbs_species(species_table = bbs_ts_data$species_table) %>% dplyr::mutate(species_id = paste('sp', species_id, sep=''), date = as.Date(paste(year, month, day, sep = "-"))) %>% - filter_ts(start_yr, end_yr, min_num_yrs) %>% dplyr::ungroup() - abundance <- bbs_data %>% + abundance <- this_bbs_data %>% dplyr::group_by(year, species_id) %>% dplyr::summarise(abundance = sum(abundance)) %>% dplyr::ungroup() %>% @@ -57,21 +76,22 @@ get_bbs_data <- function(start_yr = 1965, end_yr = 2017, min_num_yrs = 10, regio dplyr::arrange(year) %>% dplyr::select(-year) - covariates <- bbs_data %>% + covariates <- this_bbs_data %>% dplyr::group_by(year) %>% dplyr::summarise(effort = dplyr::n_distinct(site_id), starttemp = mean(starttemp), endtemp = mean(endtemp), startwind = mean(startwind), endwind = mean(endwind), startsky = mean(startsky), endsky = mean(endsky), lat = mean(lat), long = mean(long), mean_date = mean(date)) %>% - dplyr::mutate(route = this_route, region = region) %>% dplyr::arrange(year) - metadata <- list(timename = 'year', effort = 'effort') + metadata <- list(timename = 'year', effort = 'effort', route = this_route, region = this_bcr) return(list('abundance' = abundance, 'covariates' = covariates, 'metadata' = metadata)) + } + #' @title Filter BBS to specified time series period and number of samples #' #' @description Modified from https://github.com/weecology/bbs-forecasting diff --git a/man/build_bbs_datasets_plan.Rd b/man/build_bbs_datasets_plan.Rd new file mode 100644 index 0000000..7b7d6fb --- /dev/null +++ b/man/build_bbs_datasets_plan.Rd @@ -0,0 +1,18 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/build_plans.R +\name{build_bbs_datasets_plan} +\alias{build_bbs_datasets_plan} +\title{Generate a Drake Plan for BBS Datasets} +\usage{ +build_bbs_datasets_plan(bbs_ts_data) +} +\arguments{ +\item{data_path}{} +} +\value{ +a drake plan (i.e. a tibble) specifying the targets and commands + for gathering BBS datasets +} +\description{ +Generate a Drake Plan for BBS Datasets +} diff --git a/man/build_datasets_plan.Rd b/man/build_datasets_plan.Rd index 2e3268d..c3581cf 100644 --- a/man/build_datasets_plan.Rd +++ b/man/build_datasets_plan.Rd @@ -5,12 +5,14 @@ \title{Generate a Drake Plan for Datasets} \usage{ build_datasets_plan(data_path = get_default_data_path(), - include_downloaded_data = FALSE) + include_downloaded_data = FALSE, include_bbs_data = FALSE) } \arguments{ \item{data_path}{where to get the downloaded retriever datasets} \item{include_downloaded_data}{whether to also include downloadable datasets} + +\item{include_bbs_data}{whether to include BBS data} } \value{ a drake plan (i.e. a tibble) specifying the targets and commands diff --git a/man/get_bbs_route_region_data.Rd b/man/get_bbs_route_region_data.Rd new file mode 100644 index 0000000..ed317fa --- /dev/null +++ b/man/get_bbs_route_region_data.Rd @@ -0,0 +1,22 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/get_retriever_data.R +\name{get_bbs_route_region_data} +\alias{get_bbs_route_region_data} +\title{Get BBS data by route and reigon} +\usage{ +get_bbs_route_region_data(route, region, bbs_ts_data) +} +\arguments{ +\item{route}{route} + +\item{region}{region} + +\item{bbs_ts_data}{list of three dataframes (output of get_bbs_ts_data)} +} +\value{ +list of two dataframes (one with abundance data, the other with covariate data) + and one list of metadata. +} +\description{ +Get BBS data by route and reigon +} diff --git a/man/get_bbs_data.Rd b/man/get_bbs_ts_data.Rd similarity index 59% rename from man/get_bbs_data.Rd rename to man/get_bbs_ts_data.Rd index 5c0ef6f..474f38b 100644 --- a/man/get_bbs_data.Rd +++ b/man/get_bbs_ts_data.Rd @@ -1,11 +1,11 @@ % Generated by roxygen2: do not edit by hand % Please edit documentation in R/get_retriever_data.R -\name{get_bbs_data} -\alias{get_bbs_data} +\name{get_bbs_ts_data} +\alias{get_bbs_ts_data} \title{Create BBS population time-series data} \usage{ -get_bbs_data(start_yr = 1965, end_yr = 2017, min_num_yrs = 10, - region, this_route, path = get_default_data_path()) +get_bbs_ts_data(start_yr = 1965, end_yr = 2017, min_num_yrs = 10, + path = get_default_data_path()) } \arguments{ \item{start_yr}{num first year of time-series} @@ -14,15 +14,10 @@ get_bbs_data(start_yr = 1965, end_yr = 2017, min_num_yrs = 10, \item{min_num_yrs}{num minimum number of years of data between start_yr & end_yr} -\item{region}{region code of data to return (currently uses state codes)} - -\item{this_route}{which route within that region} - \item{path}{where to load the raw data files from} } \value{ -list of two dataframes (one with abundance data, the other with covariate data) - and one list of metadata. +list of three dataframes (one with bbs data filtered to time series that meet the criteria, one with the BBS species table, and one with the routes and regions represented in the first dataframe). } \description{ Modified from https://github.com/weecology/bbs-forecasting @@ -30,8 +25,3 @@ and https://github.com/weecology/MATSS-community-change Selects sites with data spanning start_yr through end_yr containing at least min_num_yrs of data samples during that period. } -\examples{ -\dontrun{ - get_bbs_data(region=7) -} -} From 2b82156431188400dfce9fa108945b21632a0804 Mon Sep 17 00:00:00 2001 From: Renata Diaz Date: Sun, 12 May 2019 15:28:31 -0400 Subject: [PATCH 06/35] Adding option to prepare the BBS data once and store it in the path/data directory. This speeds up build_bbs_dataset_plan --- NAMESPACE | 2 +- R/build_plans.R | 10 ++++++++-- R/get_retriever_data.R | 10 +++++++--- man/build_bbs_datasets_plan.Rd | 7 +++++-- man/{get_bbs_ts_data.Rd => prepare_bbs_ts_data.Rd} | 8 ++++---- 5 files changed, 25 insertions(+), 12 deletions(-) rename man/{get_bbs_ts_data.Rd => prepare_bbs_ts_data.Rd} (83%) diff --git a/NAMESPACE b/NAMESPACE index 8c3a00b..3c90420 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -10,7 +10,6 @@ export(check_default_data_path) export(collect_analyses) export(combine_subspecies) export(get_bbs_route_region_data) -export(get_bbs_ts_data) export(get_cowley_lizards) export(get_cowley_snakes) export(get_default_data_path) @@ -25,6 +24,7 @@ export(get_sgs_data) export(import_retriever_data) export(install_retriever_data) export(interpolate_obs) +export(prepare_bbs_ts_data) export(richness) export(summarise_effort) export(summarise_obs) diff --git a/R/build_plans.R b/R/build_plans.R index 1bbfcc9..24c4f97 100644 --- a/R/build_plans.R +++ b/R/build_plans.R @@ -108,15 +108,21 @@ build_datasets_plan <- function(data_path = get_default_data_path(), #' @title Generate a Drake Plan for BBS Datasets #' -#' @param data_path +#' @param data_path path +#' @param from_raw whether to re-prep BBS data #' #' @return a drake plan (i.e. a tibble) specifying the targets and commands #' for gathering BBS datasets #' #' @export #' -build_bbs_datasets_plan <- function(bbs_ts_data) +build_bbs_datasets_plan <- function(path = get_default_data_path(), from_raw = FALSE) { + if(from_raw) { + bbs_ts_data = get_bbs_ts_data() + } else { + load(paste0(path, '/breed-bird-survey-prepped/bbs_ts_data.Rds')) + } bbs_datasets <- drake::drake_plan( bbs_data_rtrg = target(get_bbs_route_region_data(route, region, bbs_ts_data), transform = map(route = !!rlang::syms(bbs_ts_data$routes_and_regions$route), diff --git a/R/get_retriever_data.R b/R/get_retriever_data.R index 55f9a2e..981dc30 100644 --- a/R/get_retriever_data.R +++ b/R/get_retriever_data.R @@ -1,4 +1,4 @@ -#' @title Create BBS population time-series data +#' @title Prepare BBS population time-series data #' #' @description Modified from https://github.com/weecology/bbs-forecasting #' and https://github.com/weecology/MATSS-community-change @@ -12,7 +12,7 @@ #' @return list of three dataframes (one with bbs data filtered to time series that meet the criteria, one with the BBS species table, and one with the routes and regions represented in the first dataframe). #' @export -get_bbs_ts_data <- function(start_yr = 1965, end_yr = 2017, min_num_yrs = 10, +prepare_bbs_ts_data <- function(start_yr = 1965, end_yr = 2017, min_num_yrs = 10, path = get_default_data_path()) { bbs_data_tables <- import_retriever_data("breed-bird-survey", path = path) @@ -43,7 +43,11 @@ get_bbs_ts_data <- function(start_yr = 1965, end_yr = 2017, min_num_yrs = 10, bbs_ts_data = list(bbs_data = bbs_data, species_table = bbs_data_tables$breed_bird_survey_species, routes_and_regions = bbs_routes_regions) - return(bbs_ts_data) + if(!dir.exists(paste0(path, '/breed-bird-survey-prepped'))) { + dir.create(paste0(path, '/breed-bird-survey-prepped')) + } + + save(bbs_ts_data, file = paste0(path, '/breed-bird-survey-prepped/bbs_ts_data.Rds')) } diff --git a/man/build_bbs_datasets_plan.Rd b/man/build_bbs_datasets_plan.Rd index 7b7d6fb..862f5be 100644 --- a/man/build_bbs_datasets_plan.Rd +++ b/man/build_bbs_datasets_plan.Rd @@ -4,10 +4,13 @@ \alias{build_bbs_datasets_plan} \title{Generate a Drake Plan for BBS Datasets} \usage{ -build_bbs_datasets_plan(bbs_ts_data) +build_bbs_datasets_plan(path = get_default_data_path(), + from_raw = FALSE) } \arguments{ -\item{data_path}{} +\item{from_raw}{whether to re-prep BBS data} + +\item{data_path}{path} } \value{ a drake plan (i.e. a tibble) specifying the targets and commands diff --git a/man/get_bbs_ts_data.Rd b/man/prepare_bbs_ts_data.Rd similarity index 83% rename from man/get_bbs_ts_data.Rd rename to man/prepare_bbs_ts_data.Rd index 474f38b..e520446 100644 --- a/man/get_bbs_ts_data.Rd +++ b/man/prepare_bbs_ts_data.Rd @@ -1,10 +1,10 @@ % Generated by roxygen2: do not edit by hand % Please edit documentation in R/get_retriever_data.R -\name{get_bbs_ts_data} -\alias{get_bbs_ts_data} -\title{Create BBS population time-series data} +\name{prepare_bbs_ts_data} +\alias{prepare_bbs_ts_data} +\title{Prepare BBS population time-series data} \usage{ -get_bbs_ts_data(start_yr = 1965, end_yr = 2017, min_num_yrs = 10, +prepare_bbs_ts_data(start_yr = 1965, end_yr = 2017, min_num_yrs = 10, path = get_default_data_path()) } \arguments{ From 1799adf21d05c588eee07c66f536ac2a0e70713b Mon Sep 17 00:00:00 2001 From: Renata Diaz Date: Mon, 13 May 2019 07:27:34 -0400 Subject: [PATCH 07/35] Correct typo --- R/build_plans.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/build_plans.R b/R/build_plans.R index 24c4f97..dc07b41 100644 --- a/R/build_plans.R +++ b/R/build_plans.R @@ -119,7 +119,7 @@ build_datasets_plan <- function(data_path = get_default_data_path(), build_bbs_datasets_plan <- function(path = get_default_data_path(), from_raw = FALSE) { if(from_raw) { - bbs_ts_data = get_bbs_ts_data() + bbs_ts_data = prepare_bbs_ts_data() } else { load(paste0(path, '/breed-bird-survey-prepped/bbs_ts_data.Rds')) } From f80ff6c61410574e86cfafd166d23cdddbca5f2b Mon Sep 17 00:00:00 2001 From: Renata Diaz Date: Mon, 13 May 2019 07:37:09 -0400 Subject: [PATCH 08/35] export bbs cleaning functions for use in MATSS-LDATS --- NAMESPACE | 2 ++ R/bbs_cleaning_functions.R | 1 + R/get_retriever_data.R | 1 + 3 files changed, 4 insertions(+) diff --git a/NAMESPACE b/NAMESPACE index 3c90420..acf4bf3 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -9,6 +9,8 @@ export(check_data_format) export(check_default_data_path) export(collect_analyses) export(combine_subspecies) +export(filter_bbs_species) +export(filter_ts) export(get_bbs_route_region_data) export(get_cowley_lizards) export(get_cowley_snakes) diff --git a/R/bbs_cleaning_functions.R b/R/bbs_cleaning_functions.R index b58901b..6b9ec1c 100644 --- a/R/bbs_cleaning_functions.R +++ b/R/bbs_cleaning_functions.R @@ -11,6 +11,7 @@ #' @param df dataframe containing an species_id column #' #' @return dataframe, filtered version of initial dataframe +#' @export filter_bbs_species <- function(df, species_table){ diff --git a/R/get_retriever_data.R b/R/get_retriever_data.R index 981dc30..4e4a997 100644 --- a/R/get_retriever_data.R +++ b/R/get_retriever_data.R @@ -107,6 +107,7 @@ get_bbs_route_region_data <- function(route, region, bbs_ts_data) { #' @param min_num_yrs num minimum number of years of data between start_yr & end_yr #' #' @return dataframe with original data and associated environmental data +#' @export filter_ts <- function(bbs_data, start_yr, end_yr, min_num_yrs) { sites_to_keep = bbs_data %>% dplyr::filter(year >= start_yr, year <= end_yr) %>% From 6a558a312e4bba0bf57c2be120f0834da09c7bac Mon Sep 17 00:00:00 2001 From: Renata Diaz Date: Mon, 13 May 2019 07:45:10 -0400 Subject: [PATCH 09/35] fix saving bug --- R/build_plans.R | 2 +- R/get_retriever_data.R | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/R/build_plans.R b/R/build_plans.R index dc07b41..6570a32 100644 --- a/R/build_plans.R +++ b/R/build_plans.R @@ -119,7 +119,7 @@ build_datasets_plan <- function(data_path = get_default_data_path(), build_bbs_datasets_plan <- function(path = get_default_data_path(), from_raw = FALSE) { if(from_raw) { - bbs_ts_data = prepare_bbs_ts_data() + prepare_bbs_ts_data() } else { load(paste0(path, '/breed-bird-survey-prepped/bbs_ts_data.Rds')) } diff --git a/R/get_retriever_data.R b/R/get_retriever_data.R index 4e4a997..89cc3cc 100644 --- a/R/get_retriever_data.R +++ b/R/get_retriever_data.R @@ -32,7 +32,7 @@ prepare_bbs_ts_data <- function(start_yr = 1965, end_yr = 2017, min_num_yrs = 10 long = longitude, species_id = aou, abundance = speciestotal) %>% - filter_ts(start_yr, end_yr, min_num_yrs) + MATSS::filter_ts(start_yr, end_yr, min_num_yrs) bbs_routes_regions <- bbs_data %>% From 026dfe045ac3c764dd68a3976652d3c1d2995578 Mon Sep 17 00:00:00 2001 From: Renata Diaz Date: Mon, 13 May 2019 07:53:04 -0400 Subject: [PATCH 10/35] finish bug fix --- R/build_plans.R | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/R/build_plans.R b/R/build_plans.R index 6570a32..fc0b49e 100644 --- a/R/build_plans.R +++ b/R/build_plans.R @@ -119,16 +119,16 @@ build_datasets_plan <- function(data_path = get_default_data_path(), build_bbs_datasets_plan <- function(path = get_default_data_path(), from_raw = FALSE) { if(from_raw) { - prepare_bbs_ts_data() - } else { - load(paste0(path, '/breed-bird-survey-prepped/bbs_ts_data.Rds')) - } - bbs_datasets <- drake::drake_plan( + prepare_bbs_ts_data() + } + load(paste0(path, '/breed-bird-survey-prepped/bbs_ts_data.Rds')) + + bbs_datasets <- drake::drake_plan( bbs_data_rtrg = target(get_bbs_route_region_data(route, region, bbs_ts_data), - transform = map(route = !!rlang::syms(bbs_ts_data$routes_and_regions$route), - region = !!rlang::syms(bbs_ts_data$routes_and_regions$bcr) - ) + transform = map(route = !!rlang::syms(bbs_ts_data$routes_and_regions$route), + region = !!rlang::syms(bbs_ts_data$routes_and_regions$bcr) + ) ) ) - return(bbs_datasets) + return(bbs_datasets) } From 6c74edb50e015b643c8850f7b9a5ff608a3aae9f Mon Sep 17 00:00:00 2001 From: Renata Diaz Date: Mon, 13 May 2019 07:56:37 -0400 Subject: [PATCH 11/35] try not saving --- R/build_plans.R | 10 ++++++---- R/get_retriever_data.R | 10 ++++++---- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/R/build_plans.R b/R/build_plans.R index fc0b49e..b064293 100644 --- a/R/build_plans.R +++ b/R/build_plans.R @@ -118,10 +118,12 @@ build_datasets_plan <- function(data_path = get_default_data_path(), #' build_bbs_datasets_plan <- function(path = get_default_data_path(), from_raw = FALSE) { - if(from_raw) { - prepare_bbs_ts_data() - } - load(paste0(path, '/breed-bird-survey-prepped/bbs_ts_data.Rds')) + # if(from_raw) { + # prepare_bbs_ts_data() + # } + # load(paste0(path, '/breed-bird-survey-prepped/bbs_ts_data.Rds')) + # + bbs_ts_data = prepare_bbs_ts_data() bbs_datasets <- drake::drake_plan( bbs_data_rtrg = target(get_bbs_route_region_data(route, region, bbs_ts_data), diff --git a/R/get_retriever_data.R b/R/get_retriever_data.R index 89cc3cc..1675499 100644 --- a/R/get_retriever_data.R +++ b/R/get_retriever_data.R @@ -43,11 +43,13 @@ prepare_bbs_ts_data <- function(start_yr = 1965, end_yr = 2017, min_num_yrs = 10 bbs_ts_data = list(bbs_data = bbs_data, species_table = bbs_data_tables$breed_bird_survey_species, routes_and_regions = bbs_routes_regions) - if(!dir.exists(paste0(path, '/breed-bird-survey-prepped'))) { - dir.create(paste0(path, '/breed-bird-survey-prepped')) - } + # if(!dir.exists(paste0(path, '/breed-bird-survey-prepped'))) { + # dir.create(paste0(path, '/breed-bird-survey-prepped')) + # } - save(bbs_ts_data, file = paste0(path, '/breed-bird-survey-prepped/bbs_ts_data.Rds')) + # save(bbs_ts_data, file = paste0(path, '/breed-bird-survey-prepped/bbs_ts_data.Rds')) + + return(bbs_ts_data) } From 7fb1652293c36b01a8111d7003aa18a1420490d0 Mon Sep 17 00:00:00 2001 From: Renata Diaz Date: Mon, 13 May 2019 08:02:22 -0400 Subject: [PATCH 12/35] update travis --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 81da994..ea15bf7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,6 +9,7 @@ warnings_are_errors: false r_packages: - covr - callr + - remotes addons: apt: From 8add2a6b8f2ad90558bd6342efec09ef38a274f1 Mon Sep 17 00:00:00 2001 From: Renata Diaz Date: Mon, 13 May 2019 08:17:57 -0400 Subject: [PATCH 13/35] fix typo --- R/build_plans.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/build_plans.R b/R/build_plans.R index b064293..9ae3eac 100644 --- a/R/build_plans.R +++ b/R/build_plans.R @@ -97,7 +97,7 @@ build_datasets_plan <- function(data_path = get_default_data_path(), } if (include_bbs_data) { - bbs_ts_data = get_bbs_ts_data() + bbs_ts_data = prepare_bbs_ts_data() bbs_datasets = build_bbs_datasets_plan(bbs_ts_data) datasets <- datasets %>% dplyr::bind_rows(bbs_datasets) From ff9b2a3e2357fda72d1fdae182b9191260a4d975 Mon Sep 17 00:00:00 2001 From: Renata Diaz Date: Mon, 13 May 2019 08:20:33 -0400 Subject: [PATCH 14/35] typo --- R/get_retriever_data.R | 2 +- man/get_bbs_route_region_data.Rd | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/R/get_retriever_data.R b/R/get_retriever_data.R index 1675499..a34e6e4 100644 --- a/R/get_retriever_data.R +++ b/R/get_retriever_data.R @@ -57,7 +57,7 @@ prepare_bbs_ts_data <- function(start_yr = 1965, end_yr = 2017, min_num_yrs = 10 #' #' @param route route #' @param region region -#' @param bbs_ts_data list of three dataframes (output of get_bbs_ts_data) +#' @param bbs_ts_data list of three dataframes (output of prepare_bbs_ts_data) #' @return list of two dataframes (one with abundance data, the other with covariate data) #' and one list of metadata. #' @export diff --git a/man/get_bbs_route_region_data.Rd b/man/get_bbs_route_region_data.Rd index ed317fa..402bd8d 100644 --- a/man/get_bbs_route_region_data.Rd +++ b/man/get_bbs_route_region_data.Rd @@ -11,7 +11,7 @@ get_bbs_route_region_data(route, region, bbs_ts_data) \item{region}{region} -\item{bbs_ts_data}{list of three dataframes (output of get_bbs_ts_data)} +\item{bbs_ts_data}{list of three dataframes (output of prepare_bbs_ts_data)} } \value{ list of two dataframes (one with abundance data, the other with covariate data) From 7fd796a49b7c02eeefcfd29c2f1492f7c484bda4 Mon Sep 17 00:00:00 2001 From: Renata Diaz Date: Mon, 13 May 2019 08:27:25 -0400 Subject: [PATCH 15/35] Add prepare_bbs_ts_data to drake plans --- R/build_plans.R | 3 ++- man/build_bbs_datasets_plan.Rd | 7 +++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/R/build_plans.R b/R/build_plans.R index 9ae3eac..0d14742 100644 --- a/R/build_plans.R +++ b/R/build_plans.R @@ -116,7 +116,7 @@ build_datasets_plan <- function(data_path = get_default_data_path(), #' #' @export #' -build_bbs_datasets_plan <- function(path = get_default_data_path(), from_raw = FALSE) +build_bbs_datasets_plan <- function(path = get_default_data_path()) { # if(from_raw) { # prepare_bbs_ts_data() @@ -126,6 +126,7 @@ build_bbs_datasets_plan <- function(path = get_default_data_path(), from_raw = F bbs_ts_data = prepare_bbs_ts_data() bbs_datasets <- drake::drake_plan( + bbs_ts_data = target(prepare_bbs_ts_data()), bbs_data_rtrg = target(get_bbs_route_region_data(route, region, bbs_ts_data), transform = map(route = !!rlang::syms(bbs_ts_data$routes_and_regions$route), region = !!rlang::syms(bbs_ts_data$routes_and_regions$bcr) diff --git a/man/build_bbs_datasets_plan.Rd b/man/build_bbs_datasets_plan.Rd index 862f5be..26d4d40 100644 --- a/man/build_bbs_datasets_plan.Rd +++ b/man/build_bbs_datasets_plan.Rd @@ -4,13 +4,12 @@ \alias{build_bbs_datasets_plan} \title{Generate a Drake Plan for BBS Datasets} \usage{ -build_bbs_datasets_plan(path = get_default_data_path(), - from_raw = FALSE) +build_bbs_datasets_plan(path = get_default_data_path()) } \arguments{ -\item{from_raw}{whether to re-prep BBS data} - \item{data_path}{path} + +\item{from_raw}{whether to re-prep BBS data} } \value{ a drake plan (i.e. a tibble) specifying the targets and commands From 55bbce7e9fcd651f16863e9f1b14c5d0fbc05e65 Mon Sep 17 00:00:00 2001 From: Renata Diaz Date: Mon, 13 May 2019 08:40:01 -0400 Subject: [PATCH 16/35] Remove bbs_ts_data from datasets chunk of drake plans, and stop evaluating prepare_bbs_ts_data twice --- R/build_plans.R | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/R/build_plans.R b/R/build_plans.R index 0d14742..17b4aa1 100644 --- a/R/build_plans.R +++ b/R/build_plans.R @@ -97,8 +97,7 @@ build_datasets_plan <- function(data_path = get_default_data_path(), } if (include_bbs_data) { - bbs_ts_data = prepare_bbs_ts_data() - bbs_datasets = build_bbs_datasets_plan(bbs_ts_data) + bbs_datasets = build_bbs_datasets_plan() datasets <- datasets %>% dplyr::bind_rows(bbs_datasets) } @@ -126,7 +125,6 @@ build_bbs_datasets_plan <- function(path = get_default_data_path()) bbs_ts_data = prepare_bbs_ts_data() bbs_datasets <- drake::drake_plan( - bbs_ts_data = target(prepare_bbs_ts_data()), bbs_data_rtrg = target(get_bbs_route_region_data(route, region, bbs_ts_data), transform = map(route = !!rlang::syms(bbs_ts_data$routes_and_regions$route), region = !!rlang::syms(bbs_ts_data$routes_and_regions$bcr) From 65f6b2a6c3de1b7602ceeb49aacbd0e9899b80f6 Mon Sep 17 00:00:00 2001 From: Renata Diaz Date: Mon, 13 May 2019 09:28:44 -0400 Subject: [PATCH 17/35] git status .! --- R/build_plans.R | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/R/build_plans.R b/R/build_plans.R index 17b4aa1..99f7b90 100644 --- a/R/build_plans.R +++ b/R/build_plans.R @@ -125,7 +125,8 @@ build_bbs_datasets_plan <- function(path = get_default_data_path()) bbs_ts_data = prepare_bbs_ts_data() bbs_datasets <- drake::drake_plan( - bbs_data_rtrg = target(get_bbs_route_region_data(route, region, bbs_ts_data), + bbs_data_rtrg = target(get_bbs_route_region_data(route, region, bbs_ts_data = prepare_bbs_ts_data() +), transform = map(route = !!rlang::syms(bbs_ts_data$routes_and_regions$route), region = !!rlang::syms(bbs_ts_data$routes_and_regions$bcr) ) From 497e3c6772ed14c46c6d1b3011005628092c5f11 Mon Sep 17 00:00:00 2001 From: Renata Diaz Date: Mon, 13 May 2019 09:31:09 -0400 Subject: [PATCH 18/35] Saving bbs tables in data directory and accessing them as needed, instead of passing them around in memory. --- R/build_plans.R | 21 +++++++++++---------- R/get_retriever_data.R | 29 +++++++++++++++-------------- man/get_bbs_route_region_data.Rd | 4 ++-- 3 files changed, 28 insertions(+), 26 deletions(-) diff --git a/R/build_plans.R b/R/build_plans.R index 99f7b90..250a8ea 100644 --- a/R/build_plans.R +++ b/R/build_plans.R @@ -117,18 +117,19 @@ build_datasets_plan <- function(data_path = get_default_data_path(), #' build_bbs_datasets_plan <- function(path = get_default_data_path()) { - # if(from_raw) { - # prepare_bbs_ts_data() - # } - # load(paste0(path, '/breed-bird-survey-prepped/bbs_ts_data.Rds')) - # - bbs_ts_data = prepare_bbs_ts_data() + if(!file.exists(paste0(path, '/breed-bird-survey-prepped/bbs_data.csv'))) { + prepare_bbs_ts_data() + } + + routes_and_regions = read.csv(paste0(path, '/breed-bird-survey-prepped/routes_and_regions_table.csv'), stringsAsFactors = F) + + routes_and_regions = routes_and_regions %>% + dplyr::mutate(bcr = as.character(bcr), route = as.character(route)) bbs_datasets <- drake::drake_plan( - bbs_data_rtrg = target(get_bbs_route_region_data(route, region, bbs_ts_data = prepare_bbs_ts_data() -), - transform = map(route = !!rlang::syms(bbs_ts_data$routes_and_regions$route), - region = !!rlang::syms(bbs_ts_data$routes_and_regions$bcr) + bbs_data_rtrg = target(get_bbs_route_region_data(route, region, path = get_default_data_path()), + transform = map(route = !!rlang::syms(routes_and_regions$route), + region = !!rlang::syms(routes_and_regions$bcr) ) ) ) diff --git a/R/get_retriever_data.R b/R/get_retriever_data.R index a34e6e4..40433a8 100644 --- a/R/get_retriever_data.R +++ b/R/get_retriever_data.R @@ -38,38 +38,39 @@ prepare_bbs_ts_data <- function(start_yr = 1965, end_yr = 2017, min_num_yrs = 10 bbs_routes_regions <- bbs_data %>% dplyr::select(bcr, route) %>% dplyr::distinct() %>% - dplyr::mutate(bcr = as.character(bcr), route = as.character(route)) %>% dplyr::mutate(name = paste0("bbs_bcr", bcr, "_route", route)) - bbs_ts_data = list(bbs_data = bbs_data, species_table = bbs_data_tables$breed_bird_survey_species, routes_and_regions = bbs_routes_regions) + if(!dir.exists(paste0(path, '/breed-bird-survey-prepped'))) { + dir.create(paste0(path, '/breed-bird-survey-prepped')) + } - # if(!dir.exists(paste0(path, '/breed-bird-survey-prepped'))) { - # dir.create(paste0(path, '/breed-bird-survey-prepped')) - # } + write.csv(bbs_data, paste0(path, '/breed-bird-survey-prepped/bbs_data.csv'), row.names = F) + write.csv(bbs_data_tables$breed_bird_survey_species, paste0(path, '/breed-bird-survey-prepped/species_table.csv'), row.names = F) + write.csv(bbs_routes_regions, paste0(path, '/breed-bird-survey-prepped/routes_and_regions_table.csv'), row.names = F) - # save(bbs_ts_data, file = paste0(path, '/breed-bird-survey-prepped/bbs_ts_data.Rds')) - - return(bbs_ts_data) -} + } #' Get BBS data by route and reigon #' #' @param route route #' @param region region -#' @param bbs_ts_data list of three dataframes (output of prepare_bbs_ts_data) +#' @param path path #' @return list of two dataframes (one with abundance data, the other with covariate data) #' and one list of metadata. #' @export -get_bbs_route_region_data <- function(route, region, bbs_ts_data) { +get_bbs_route_region_data <- function(route, region, path = get_default_data_path()) { route = as.numeric(route) region = as.numeric(region) - this_bbs_data <- bbs_ts_data$bbs_data %>% + bbs_data <- read.csv(paste0(path, '/breed-bird-survey-prepped/bbs_data.csv'), stringsAsFactors = F) + species_table <- read.csv(paste0(path, '/breed-bird-survey-prepped/species_table.csv'), stringsAsFactors = F) + + this_bbs_data <- bbs_data %>% dplyr::filter(bcr == region, route == route) %>% - combine_subspecies(species_table = bbs_ts_data$species_table) %>% - filter_bbs_species(species_table = bbs_ts_data$species_table) %>% + combine_subspecies(species_table = species_table) %>% + filter_bbs_species(species_table = species_table) %>% dplyr::mutate(species_id = paste('sp', species_id, sep=''), date = as.Date(paste(year, month, day, sep = "-"))) %>% dplyr::ungroup() diff --git a/man/get_bbs_route_region_data.Rd b/man/get_bbs_route_region_data.Rd index 402bd8d..ad89072 100644 --- a/man/get_bbs_route_region_data.Rd +++ b/man/get_bbs_route_region_data.Rd @@ -4,14 +4,14 @@ \alias{get_bbs_route_region_data} \title{Get BBS data by route and reigon} \usage{ -get_bbs_route_region_data(route, region, bbs_ts_data) +get_bbs_route_region_data(route, region, path = get_default_data_path()) } \arguments{ \item{route}{route} \item{region}{region} -\item{bbs_ts_data}{list of three dataframes (output of prepare_bbs_ts_data)} +\item{path}{path} } \value{ list of two dataframes (one with abundance data, the other with covariate data) From a39e54ce8643dafac8cd9d2c42159b46c4cd9dbf Mon Sep 17 00:00:00 2001 From: Renata Diaz Date: Mon, 13 May 2019 09:44:25 -0400 Subject: [PATCH 19/35] fix typo --- R/get_retriever_data.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/get_retriever_data.R b/R/get_retriever_data.R index 40433a8..a801849 100644 --- a/R/get_retriever_data.R +++ b/R/get_retriever_data.R @@ -92,7 +92,7 @@ get_bbs_route_region_data <- function(route, region, path = get_default_data_pat lat = mean(lat), long = mean(long), mean_date = mean(date)) %>% dplyr::arrange(year) - metadata <- list(timename = 'year', effort = 'effort', route = this_route, region = this_bcr) + metadata <- list(timename = 'year', effort = 'effort', route = route, region = region) return(list('abundance' = abundance, 'covariates' = covariates, 'metadata' = metadata)) From 0f49c864f37d62e79badab4287163920cbc410e6 Mon Sep 17 00:00:00 2001 From: Renata Diaz Date: Mon, 13 May 2019 10:29:25 -0400 Subject: [PATCH 20/35] Adjust & add tests for BBS plans --- tests/testthat/test-05-build-plans.R | 43 +++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/tests/testthat/test-05-build-plans.R b/tests/testthat/test-05-build-plans.R index 8daf28c..0b930e1 100644 --- a/tests/testthat/test-05-build-plans.R +++ b/tests/testthat/test-05-build-plans.R @@ -28,7 +28,7 @@ test_that("build_datasets_plan works", { expect_error(datasets <- build_datasets_plan(include_downloaded_data = TRUE), NA) expect_plan(datasets) expect_true(all(grepl("_data$", datasets$target))) - expect_equal(dim(datasets), c(11, 2)) + expect_equal(dim(datasets), c(10, 2)) }) test_that("build_analyses_plan works", { @@ -65,3 +65,44 @@ test_that("build_analyses_plan works", { expect_true(all(grepl("^list\\(", vapply(fun_calls, dplyr::last, "")))) }) +test_that("build_bbs_datasets_plan works", { + expect_error(datasets <- build_datasets_plan(include_bbs_data = T), NA) + + datasets <- build_datasets_plan(include_bbs_data = T) + + expect_plan(datasets) + # expect_true(all(grepl("_data$", datasets$target))) + expect_equal(dim(datasets), c(2594, 2)) + + methods <- drake::drake_plan( + abs = abs, + mean = mean + ) + N <- NROW(datasets) + M <- NROW(methods) + + expect_error(analyses <- build_analyses_plan(methods, datasets), NA) + expect_equal(NROW(analyses), N * M + M) + + expect_error(analyses <- build_analyses_plan(methods, datasets, trace = TRUE), NA) + expect_equal(NROW(analyses), N * M + M) + + subplan_abs <- dplyr::filter(analyses, grepl("^analysis_abs_", target)) + expect_equal(NROW(subplan_abs), N) + expect_true(all(subplan_abs$fun == "abs")) + expect_identical(subplan_abs$data, datasets$target) + + subplan_mean <- dplyr::filter(analyses, grepl("^analysis_mean_", target)) + expect_equal(NROW(subplan_mean), N) + expect_true(all(subplan_mean$fun == "mean")) + expect_identical(subplan_mean$data, datasets$target) + + subplan_results <- dplyr::filter(analyses, grepl("^results_", target)) + expect_equal(NROW(subplan_results), M) + expect_identical(subplan_results$fun, methods$target) + + fun_calls <- lapply(subplan_results$command, as.character) + expect_true(all(vapply(fun_calls, dplyr::first, "") == "MATSS::collect_analyses")) + expect_true(all(grepl("^list\\(", vapply(fun_calls, dplyr::last, "")))) + +}) From 6cc5db8a6efeae73557b5fde842f16e73b40393f Mon Sep 17 00:00:00 2001 From: Renata Diaz Date: Mon, 13 May 2019 11:04:11 -0400 Subject: [PATCH 21/35] skip bbs plan tests for now --- tests/testthat/test-05-build-plans.R | 82 ++++++++++++++-------------- 1 file changed, 41 insertions(+), 41 deletions(-) diff --git a/tests/testthat/test-05-build-plans.R b/tests/testthat/test-05-build-plans.R index 0b930e1..e6dd194 100644 --- a/tests/testthat/test-05-build-plans.R +++ b/tests/testthat/test-05-build-plans.R @@ -65,44 +65,44 @@ test_that("build_analyses_plan works", { expect_true(all(grepl("^list\\(", vapply(fun_calls, dplyr::last, "")))) }) -test_that("build_bbs_datasets_plan works", { - expect_error(datasets <- build_datasets_plan(include_bbs_data = T), NA) - - datasets <- build_datasets_plan(include_bbs_data = T) - - expect_plan(datasets) - # expect_true(all(grepl("_data$", datasets$target))) - expect_equal(dim(datasets), c(2594, 2)) - - methods <- drake::drake_plan( - abs = abs, - mean = mean - ) - N <- NROW(datasets) - M <- NROW(methods) - - expect_error(analyses <- build_analyses_plan(methods, datasets), NA) - expect_equal(NROW(analyses), N * M + M) - - expect_error(analyses <- build_analyses_plan(methods, datasets, trace = TRUE), NA) - expect_equal(NROW(analyses), N * M + M) - - subplan_abs <- dplyr::filter(analyses, grepl("^analysis_abs_", target)) - expect_equal(NROW(subplan_abs), N) - expect_true(all(subplan_abs$fun == "abs")) - expect_identical(subplan_abs$data, datasets$target) - - subplan_mean <- dplyr::filter(analyses, grepl("^analysis_mean_", target)) - expect_equal(NROW(subplan_mean), N) - expect_true(all(subplan_mean$fun == "mean")) - expect_identical(subplan_mean$data, datasets$target) - - subplan_results <- dplyr::filter(analyses, grepl("^results_", target)) - expect_equal(NROW(subplan_results), M) - expect_identical(subplan_results$fun, methods$target) - - fun_calls <- lapply(subplan_results$command, as.character) - expect_true(all(vapply(fun_calls, dplyr::first, "") == "MATSS::collect_analyses")) - expect_true(all(grepl("^list\\(", vapply(fun_calls, dplyr::last, "")))) - -}) +# test_that("build_bbs_datasets_plan works", { +# expect_error(datasets <- build_datasets_plan(include_bbs_data = T), NA) +# +# datasets <- build_datasets_plan(include_bbs_data = T) +# +# expect_plan(datasets) +# # expect_true(all(grepl("_data$", datasets$target))) +# expect_equal(dim(datasets), c(2594, 2)) +# +# methods <- drake::drake_plan( +# abs = abs, +# mean = mean +# ) +# N <- NROW(datasets) +# M <- NROW(methods) +# +# expect_error(analyses <- build_analyses_plan(methods, datasets), NA) +# expect_equal(NROW(analyses), N * M + M) +# +# expect_error(analyses <- build_analyses_plan(methods, datasets, trace = TRUE), NA) +# expect_equal(NROW(analyses), N * M + M) +# +# subplan_abs <- dplyr::filter(analyses, grepl("^analysis_abs_", target)) +# expect_equal(NROW(subplan_abs), N) +# expect_true(all(subplan_abs$fun == "abs")) +# expect_identical(subplan_abs$data, datasets$target) +# +# subplan_mean <- dplyr::filter(analyses, grepl("^analysis_mean_", target)) +# expect_equal(NROW(subplan_mean), N) +# expect_true(all(subplan_mean$fun == "mean")) +# expect_identical(subplan_mean$data, datasets$target) +# +# subplan_results <- dplyr::filter(analyses, grepl("^results_", target)) +# expect_equal(NROW(subplan_results), M) +# expect_identical(subplan_results$fun, methods$target) +# +# fun_calls <- lapply(subplan_results$command, as.character) +# expect_true(all(vapply(fun_calls, dplyr::first, "") == "MATSS::collect_analyses")) +# expect_true(all(grepl("^list\\(", vapply(fun_calls, dplyr::last, "")))) +# +# }) From 635275aaca1562e8d0357997f9116daac76e7234 Mon Sep 17 00:00:00 2001 From: Renata Diaz Date: Mon, 13 May 2019 11:34:13 -0400 Subject: [PATCH 22/35] Remove test for get_bbs_data (removed) --- tests/testthat/test-04-retriever-data.R | 28 ++++++++++++------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/tests/testthat/test-04-retriever-data.R b/tests/testthat/test-04-retriever-data.R index 469ee7c..92818e5 100644 --- a/tests/testthat/test-04-retriever-data.R +++ b/tests/testthat/test-04-retriever-data.R @@ -1,18 +1,18 @@ context("Check Retriever datasets") - -test_that("get_bbs_data formats data correctly", { - data_path <- system.file("extdata", "subsampled", - package = "MATSS", mustWork = TRUE) - Sys.setenv(MATSS_DATA_PATH = data_path) - expect_error(dat <- get_bbs_data(region = 4, min_num_yrs = 1), NA) - expect_true(check_data_format(dat)) - expect_known_hash(dat$abundance, "0d083ef430") - expect_known_hash(which(is.na(dat$covariates)), "40f5faaa59") - dat$covariates[is.na(dat$covariates)] <- -999999 - expect_known_hash(na.omit(dat$covariates), "6c2f809118") - expect_known_hash(dat$metadata, "b5adce4593") - expect_known_hash(dat, "72aa13aef2") -}) +# +# test_that("get_bbs_data formats data correctly", { +# data_path <- system.file("extdata", "subsampled", +# package = "MATSS", mustWork = TRUE) +# Sys.setenv(MATSS_DATA_PATH = data_path) +# expect_error(dat <- get_bbs_data(region = 4, min_num_yrs = 1), NA) +# expect_true(check_data_format(dat)) +# expect_known_hash(dat$abundance, "0d083ef430") +# expect_known_hash(which(is.na(dat$covariates)), "40f5faaa59") +# dat$covariates[is.na(dat$covariates)] <- -999999 +# expect_known_hash(na.omit(dat$covariates), "6c2f809118") +# expect_known_hash(dat$metadata, "b5adce4593") +# expect_known_hash(dat, "72aa13aef2") +# }) test_that("get_mtquad_data formats data correctly", { data_path <- system.file("extdata", "subsampled", From e02c118507c8be4386f6a8161a18a82f47a1b7f7 Mon Sep 17 00:00:00 2001 From: Renata Diaz Date: Mon, 27 May 2019 12:09:26 -0400 Subject: [PATCH 23/35] Rearrange BBS functions --- NAMESPACE | 18 +-- R/bbs_cleaning_functions.R | 138 ++++++++++++++++++ R/build_plans.R | 4 +- R/get_retriever_data.R | 133 ++--------------- man/get_bbs_route_region_data.Rd | 22 --- man/prepare_bbs_ts_data.Rd | 5 +- man/subset_bbs_route_region_data.Rd | 26 ++++ man/ts_summary.Rd | 3 +- vignettes/.drake/config/compress | 1 + vignettes/.drake/config/hash_algorithm | 1 + vignettes/.drake/config/mangle_key | 1 + vignettes/.drake/config/mangle_key_pad | 1 + vignettes/.drake/config/version | 1 + vignettes/.drake/data/052f671a04361c98.rds | Bin 0 -> 464 bytes vignettes/.drake/data/23fbbc5bddad2ce9.rds | Bin 0 -> 56 bytes vignettes/.drake/data/2c3d8028117512b7.rds | Bin 0 -> 53 bytes vignettes/.drake/data/2c697c6e11c14fba.rds | Bin 0 -> 465 bytes vignettes/.drake/data/3a8c46c97499a3c1.rds | Bin 0 -> 52 bytes vignettes/.drake/data/697685ec6b4d717c.rds | Bin 0 -> 150 bytes vignettes/.drake/data/6d6f4d10f2d3a386.rds | Bin 0 -> 579 bytes vignettes/.drake/data/7a71b3f7028b8f92.rds | Bin 0 -> 120 bytes vignettes/.drake/data/8271c9325d9ef093.rds | Bin 0 -> 40 bytes vignettes/.drake/data/8e42b9635a511761.rds | Bin 0 -> 528 bytes vignettes/.drake/data/9756935bcff80d2e.rds | Bin 0 -> 29713 bytes vignettes/.drake/data/9882e97b88564731.rds | Bin 0 -> 40 bytes vignettes/.drake/data/9971168f30739e70.rds | Bin 0 -> 538 bytes vignettes/.drake/data/997f44f13ddf401c.rds | Bin 0 -> 50 bytes vignettes/.drake/data/b87d23767f391c18.rds | Bin 0 -> 285 bytes vignettes/.drake/data/c28168faa0aa7ba1.rds | Bin 0 -> 4191 bytes vignettes/.drake/data/c40c00762a0dac94.rds | Bin 0 -> 41 bytes vignettes/.drake/data/c82520a724587517.rds | Bin 0 -> 326 bytes vignettes/.drake/data/cb0cc88d6109b9c8.rds | Bin 0 -> 1081 bytes vignettes/.drake/data/f4b89e63bc92af79.rds | Bin 0 -> 1217 bytes vignettes/.drake/keys/common/FALSE | 1 + vignettes/.drake/keys/common/TRUE | 1 + vignettes/.drake/keys/common/done | 1 + vignettes/.drake/keys/common/failed | 1 + vignettes/.drake/keys/common/running | 1 + .../.drake/keys/memoize/1d62b406b8183a75 | 1 + .../.drake/keys/memoize/2d6b88bf86616450 | 1 + .../.drake/keys/memoize/5b70a6a1d10f6a37 | 1 + .../.drake/keys/memoize/86e46293dac72466 | 1 + vignettes/.drake/keys/objects/data_1 | 1 + vignettes/.drake/keys/objects/data_2 | 1 + vignettes/.drake/keys/objects/my_model | 1 + vignettes/.drake/keys/objects/my_summary | 1 + vignettes/.drake/keys/progress/data_1 | 1 + vignettes/.drake/keys/progress/data_2 | 1 + vignettes/.drake/keys/progress/my_model | 1 + vignettes/.drake/keys/progress/my_summary | 1 + vignettes/.drake/keys/session/drake_version | 1 + vignettes/.drake/keys/session/seed | 1 + vignettes/.drake/keys/session/sessionInfo | 1 + 53 files changed, 207 insertions(+), 167 deletions(-) delete mode 100644 man/get_bbs_route_region_data.Rd create mode 100644 man/subset_bbs_route_region_data.Rd create mode 100644 vignettes/.drake/config/compress create mode 100644 vignettes/.drake/config/hash_algorithm create mode 100644 vignettes/.drake/config/mangle_key create mode 100644 vignettes/.drake/config/mangle_key_pad create mode 100644 vignettes/.drake/config/version create mode 100644 vignettes/.drake/data/052f671a04361c98.rds create mode 100644 vignettes/.drake/data/23fbbc5bddad2ce9.rds create mode 100644 vignettes/.drake/data/2c3d8028117512b7.rds create mode 100644 vignettes/.drake/data/2c697c6e11c14fba.rds create mode 100644 vignettes/.drake/data/3a8c46c97499a3c1.rds create mode 100644 vignettes/.drake/data/697685ec6b4d717c.rds create mode 100644 vignettes/.drake/data/6d6f4d10f2d3a386.rds create mode 100644 vignettes/.drake/data/7a71b3f7028b8f92.rds create mode 100644 vignettes/.drake/data/8271c9325d9ef093.rds create mode 100644 vignettes/.drake/data/8e42b9635a511761.rds create mode 100644 vignettes/.drake/data/9756935bcff80d2e.rds create mode 100644 vignettes/.drake/data/9882e97b88564731.rds create mode 100644 vignettes/.drake/data/9971168f30739e70.rds create mode 100644 vignettes/.drake/data/997f44f13ddf401c.rds create mode 100644 vignettes/.drake/data/b87d23767f391c18.rds create mode 100644 vignettes/.drake/data/c28168faa0aa7ba1.rds create mode 100644 vignettes/.drake/data/c40c00762a0dac94.rds create mode 100644 vignettes/.drake/data/c82520a724587517.rds create mode 100644 vignettes/.drake/data/cb0cc88d6109b9c8.rds create mode 100644 vignettes/.drake/data/f4b89e63bc92af79.rds create mode 100644 vignettes/.drake/keys/common/FALSE create mode 100644 vignettes/.drake/keys/common/TRUE create mode 100644 vignettes/.drake/keys/common/done create mode 100644 vignettes/.drake/keys/common/failed create mode 100644 vignettes/.drake/keys/common/running create mode 100644 vignettes/.drake/keys/memoize/1d62b406b8183a75 create mode 100644 vignettes/.drake/keys/memoize/2d6b88bf86616450 create mode 100644 vignettes/.drake/keys/memoize/5b70a6a1d10f6a37 create mode 100644 vignettes/.drake/keys/memoize/86e46293dac72466 create mode 100644 vignettes/.drake/keys/objects/data_1 create mode 100644 vignettes/.drake/keys/objects/data_2 create mode 100644 vignettes/.drake/keys/objects/my_model create mode 100644 vignettes/.drake/keys/objects/my_summary create mode 100644 vignettes/.drake/keys/progress/data_1 create mode 100644 vignettes/.drake/keys/progress/data_2 create mode 100644 vignettes/.drake/keys/progress/my_model create mode 100644 vignettes/.drake/keys/progress/my_summary create mode 100644 vignettes/.drake/keys/session/drake_version create mode 100644 vignettes/.drake/keys/session/seed create mode 100644 vignettes/.drake/keys/session/sessionInfo diff --git a/NAMESPACE b/NAMESPACE index acf4bf3..20abaa6 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -11,7 +11,6 @@ export(collect_analyses) export(combine_subspecies) export(filter_bbs_species) export(filter_ts) -export(get_bbs_route_region_data) export(get_cowley_lizards) export(get_cowley_snakes) export(get_default_data_path) @@ -28,6 +27,7 @@ export(install_retriever_data) export(interpolate_obs) export(prepare_bbs_ts_data) export(richness) +export(subset_bbs_route_region_data) export(summarise_effort) export(summarise_obs) export(summarise_times) @@ -39,21 +39,5 @@ export(ts_summary) export(ts_summary_drake) export(uni_ts_summary) export(use_default_data_path) -importFrom(graphics,axis) -importFrom(graphics,mtext) -importFrom(graphics,par) -importFrom(graphics,plot) -importFrom(graphics,points) -importFrom(graphics,rect) -importFrom(graphics,text) importFrom(magrittr,"%>%") -importFrom(stats,D) -importFrom(stats,acf) -importFrom(stats,cor) -importFrom(stats,median) -importFrom(stats,na.omit) -importFrom(stats,sd) -importFrom(stats,setNames) -importFrom(utils,data) -importFrom(utils,read.csv) importFrom(utils,read.delim) diff --git a/R/bbs_cleaning_functions.R b/R/bbs_cleaning_functions.R index 6b9ec1c..13d7568 100644 --- a/R/bbs_cleaning_functions.R +++ b/R/bbs_cleaning_functions.R @@ -1,3 +1,141 @@ +#' @title Prepare BBS population time-series data +#' @description Modified from https://github.com/weecology/bbs-forecasting +#' and https://github.com/weecology/MATSS-community-change +#' Selects sites with data spanning start_yr through end_yr containing at least min_num_yrs of data +#' samples during that period. Cleans data tables and stores each individual route as a .Rds file. Saves a data table of the route + region pairs. +#' @param start_yr num first year of time-series +#' @param end_yr num last year of time-series +#' @param min_num_yrs num minimum number of years of data between start_yr & end_yr +#' @inheritParams get_mtquad_data +#' @return NULL +#' @export + +prepare_bbs_ts_data <- function(start_yr = 1965, end_yr = 2017, min_num_yrs = 10, + path = get_default_data_path()){ + bbs_data_tables <- import_retriever_data("breed-bird-survey", path = path) + + bbs_data <- bbs_data_tables$breed_bird_survey_weather %>% + dplyr::filter(runtype == 1, rpid == 101) %>% + dplyr::left_join(bbs_data_tables$breed_bird_survey_counts, + by = c('statenum', 'route', 'rpid', 'year', 'routedataid', 'countrynum')) %>% + dplyr::left_join(bbs_data_tables$breed_bird_survey_routes, + by = c('statenum', 'route', 'countrynum')) %>% + dplyr::mutate(site_id = statenum*1000 + route, + starttemp = dplyr::case_when(tempscale=='F' ~ c((starttemp - 32)*5/9), + tempscale=='C' ~ as.double(starttemp)), + endtemp = dplyr::case_when(tempscale=='F' ~ c((endtemp - 32)*5/9), + tempscale=='C' ~ as.double(endtemp))) %>% + dplyr::rename(lat = latitude, + long = longitude, + species_id = aou, + abundance = speciestotal) %>% + MATSS::filter_ts(start_yr, end_yr, min_num_yrs) + + + bbs_routes_regions <- bbs_data %>% + dplyr::select(bcr, route) %>% + dplyr::distinct() %>% + dplyr::mutate(name = paste0("bbs_bcr", bcr, "_route", route)) + + if(!dir.exists(file.path(path, 'breed-bird-survey-prepped'))) { + dir.create(file.path(path, 'breed-bird-survey-prepped')) + } + + write.csv(bbs_routes_regions, file.path(path, "breed-bird-survey-prepped", "routes_and_regions_table.csv"), row.names = F) + + make_list <- function(bbs_line) { + return(list(route = as.numeric(bbs_line[2]), region = as.numeric(bbs_line[1]))) + } + bbs_routes_regions_list = apply(bbs_routes_regions, MARGIN = 1, FUN = make_list) + + lapply(bbs_routes_regions_list, FUN = subset_bbs_route_region_data, bbs_data_table = bbs_data, species_table = bbs_data_tables$breed_bird_survey_species, path = path) + +} + + +#' Subset BBS data by route and reigon +#' Writes each route & region data object (a list of abundance, metadata, and covariates) as an .Rds file to be re-read via readRDS. +#' @param route_region named list of route and region to subset to +#' @param bbs_data_table main bbs data table +#' @param species_table table of species for BBS +#' @param path path +#' @return nothing +#' @export +subset_bbs_route_region_data <- function(route_region, bbs_data_table, species_table, + path = get_default_data_path()) { + + route = as.numeric(route_region$route) + region = as.numeric(route_region$region) + + this_bbs_data <- bbs_data_table %>% + dplyr::filter(bcr == region, route == route) %>% + combine_subspecies(species_table = species_table) %>% + filter_bbs_species(species_table = species_table) %>% + dplyr::mutate(species_id = paste('sp', species_id, sep=''), + date = as.Date(paste(year, month, day, sep = "-"))) %>% + dplyr::ungroup() + + abundance <- this_bbs_data %>% + dplyr::group_by(year, species_id) %>% + dplyr::summarise(abundance = sum(abundance)) %>% + dplyr::ungroup() %>% + tidyr::spread(key = species_id, value = abundance, fill = 0) %>% + dplyr::arrange(year) %>% + dplyr::select(-year) + + covariates <- this_bbs_data %>% + dplyr::group_by(year) %>% + dplyr::summarise(effort = dplyr::n_distinct(site_id), + starttemp = mean(starttemp), endtemp = mean(endtemp), + startwind = mean(startwind), endwind = mean(endwind), + startsky = mean(startsky), endsky = mean(endsky), + lat = mean(lat), long = mean(long), mean_date = mean(date)) %>% + dplyr::arrange(year) + + metadata <- list(timename = 'year', effort = 'effort', route = route, region = region) + + + if(!dir.exists(file.path(path, 'breed-bird-survey-prepped'))) { + dir.create(file.path(path, 'breed-bird-survey-prepped')) + } + + storage_path = file.path(path, 'breed-bird-survey-prepped') + + this_bbs_result = list('abundance' = abundance, 'covariates' = covariates, 'metadata' = metadata) + + saveRDS(this_bbs_result, file = file.path(storage_path, paste0("route", route, "region", region, ".Rds")) ) + + return() + +} + + +#' @title Filter BBS to specified time series period and number of samples +#' +#' @description Modified from https://github.com/weecology/bbs-forecasting +#' and https://github.com/weecology/MATSS-community-change +#' +#' @param bbs_data dataframe that contains BBS site_id and year columns +#' @param start_yr num first year of time-series +#' @param end_yr num last year of time-series +#' @param min_num_yrs num minimum number of years of data between start_yr & end_yr +#' +#' @return dataframe with original data and associated environmental data +#' @export +filter_ts <- function(bbs_data, start_yr, end_yr, min_num_yrs) { + sites_to_keep = bbs_data %>% + dplyr::filter(year >= start_yr, year <= end_yr) %>% + dplyr::group_by(site_id) %>% + dplyr::summarise(num_years = length(unique(year))) %>% + dplyr::ungroup() %>% + dplyr::filter(num_years >= min_num_yrs) + + filtered_data <- bbs_data %>% + dplyr::filter(year >= start_yr, year <= end_yr) %>% + dplyr::filter(site_id %in% sites_to_keep$site_id) +} + + #' Filter poorly sampled BBS species #' #' Modified from https://github.com/weecology/bbs-forecasting/blob/master/R/forecast-bbs-core.R diff --git a/R/build_plans.R b/R/build_plans.R index 250a8ea..942d927 100644 --- a/R/build_plans.R +++ b/R/build_plans.R @@ -117,11 +117,11 @@ build_datasets_plan <- function(data_path = get_default_data_path(), #' build_bbs_datasets_plan <- function(path = get_default_data_path()) { - if(!file.exists(paste0(path, '/breed-bird-survey-prepped/bbs_data.csv'))) { + if(!file.exists(file.path(path, "breed-bird-survey-prepped", "routes_and_regions_table.csv"))) { prepare_bbs_ts_data() } - routes_and_regions = read.csv(paste0(path, '/breed-bird-survey-prepped/routes_and_regions_table.csv'), stringsAsFactors = F) + routes_and_regions = read.csv(file.path(path, "breed-bird-survey-prepped", "routes_and_regions_table.csv"), stringsAsFactors = F) routes_and_regions = routes_and_regions %>% dplyr::mutate(bcr = as.character(bcr), route = as.character(route)) diff --git a/R/get_retriever_data.R b/R/get_retriever_data.R index 1d2a210..1030e0a 100644 --- a/R/get_retriever_data.R +++ b/R/get_retriever_data.R @@ -1,129 +1,20 @@ -#' @title Prepare BBS population time-series data -#' -#' @description Modified from https://github.com/weecology/bbs-forecasting -#' and https://github.com/weecology/MATSS-community-change -#' Selects sites with data spanning start_yr through end_yr containing at least min_num_yrs of data -#' samples during that period. -#' @param start_yr num first year of time-series -#' @param end_yr num last year of time-series -#' @param min_num_yrs num minimum number of years of data between start_yr & end_yr -#' @inheritParams get_mtquad_data -#' -#' @return list of three dataframes (one with bbs data filtered to time series that meet the criteria, one with the BBS species table, and one with the routes and regions represented in the first dataframe). +#' Get cleaned BBS data +#' @description Gets prepped BBS data (as a list of abundance, covariates, and metadata) for a specified route and region. First run `prepare_bbs_data` to create these files from the raw BBS data tables +#' @param route Route number +#' @param region Region number +#' @param path Data storage path +#' @return list of abundance, covariates, and metadata #' @export - -prepare_bbs_ts_data <- function(start_yr = 1965, end_yr = 2017, min_num_yrs = 10, - path = get_default_data_path()) -{ - bbs_data_tables <- import_retriever_data("breed-bird-survey", path = path) - - bbs_data <- bbs_data_tables$breed_bird_survey_weather %>% - dplyr::filter(runtype == 1, rpid == 101) %>% - dplyr::left_join(bbs_data_tables$breed_bird_survey_counts, - by = c('statenum', 'route', 'rpid', 'year', 'routedataid', 'countrynum')) %>% - dplyr::left_join(bbs_data_tables$breed_bird_survey_routes, - by = c('statenum', 'route', 'countrynum')) %>% - dplyr::mutate(site_id = statenum*1000 + route, - starttemp = dplyr::case_when(tempscale=='F' ~ c((starttemp - 32)*5/9), - tempscale=='C' ~ as.double(starttemp)), - endtemp = dplyr::case_when(tempscale=='F' ~ c((endtemp - 32)*5/9), - tempscale=='C' ~ as.double(endtemp))) %>% - dplyr::rename(lat = latitude, - long = longitude, - species_id = aou, - abundance = speciestotal) %>% - MATSS::filter_ts(start_yr, end_yr, min_num_yrs) - - - bbs_routes_regions <- bbs_data %>% - dplyr::select(bcr, route) %>% - dplyr::distinct() %>% - dplyr::mutate(name = paste0("bbs_bcr", bcr, "_route", route)) - - if(!dir.exists(paste0(path, '/breed-bird-survey-prepped'))) { - dir.create(paste0(path, '/breed-bird-survey-prepped')) +get_bbs_route_region_data = function(route, region, path = get_default_data_path()) { + this_path = file.path(path, "breed-bird-survey-prepped", paste0("route", route, "region", region, ".Rds")) + if(file.exists(this_path)) { + return(readRDS(this_path)) + } else { + return(NULL) } - - write.csv(bbs_data, paste0(path, '/breed-bird-survey-prepped/bbs_data.csv'), row.names = F) - write.csv(bbs_data_tables$breed_bird_survey_species, paste0(path, '/breed-bird-survey-prepped/species_table.csv'), row.names = F) - write.csv(bbs_routes_regions, paste0(path, '/breed-bird-survey-prepped/routes_and_regions_table.csv'), row.names = F) - - } - - -#' Get BBS data by route and reigon -#' -#' @param route route -#' @param region region -#' @param path path -#' @return list of two dataframes (one with abundance data, the other with covariate data) -#' and one list of metadata. -#' @export -get_bbs_route_region_data <- function(route, region, path = get_default_data_path()) { - - route = as.numeric(route) - region = as.numeric(region) - - bbs_data <- read.csv(paste0(path, '/breed-bird-survey-prepped/bbs_data.csv'), stringsAsFactors = F) - species_table <- read.csv(paste0(path, '/breed-bird-survey-prepped/species_table.csv'), stringsAsFactors = F) - - this_bbs_data <- bbs_data %>% - dplyr::filter(bcr == region, route == route) %>% - combine_subspecies(species_table = species_table) %>% - filter_bbs_species(species_table = species_table) %>% - dplyr::mutate(species_id = paste('sp', species_id, sep=''), - date = as.Date(paste(year, month, day, sep = "-"))) %>% - dplyr::ungroup() - - abundance <- this_bbs_data %>% - dplyr::group_by(year, species_id) %>% - dplyr::summarise(abundance = sum(abundance)) %>% - dplyr::ungroup() %>% - tidyr::spread(key = species_id, value = abundance, fill = 0) %>% - dplyr::arrange(year) %>% - dplyr::select(-year) - - covariates <- this_bbs_data %>% - dplyr::group_by(year) %>% - dplyr::summarise(effort = dplyr::n_distinct(site_id), - starttemp = mean(starttemp), endtemp = mean(endtemp), - startwind = mean(startwind), endwind = mean(endwind), - startsky = mean(startsky), endsky = mean(endsky), - lat = mean(lat), long = mean(long), mean_date = mean(date)) %>% - dplyr::arrange(year) - - metadata <- list(timename = 'year', effort = 'effort', route = route, region = region) - - return(list('abundance' = abundance, 'covariates' = covariates, 'metadata' = metadata)) - } -#' @title Filter BBS to specified time series period and number of samples -#' -#' @description Modified from https://github.com/weecology/bbs-forecasting -#' and https://github.com/weecology/MATSS-community-change -#' -#' @param bbs_data dataframe that contains BBS site_id and year columns -#' @param start_yr num first year of time-series -#' @param end_yr num last year of time-series -#' @param min_num_yrs num minimum number of years of data between start_yr & end_yr -#' -#' @return dataframe with original data and associated environmental data -#' @export -filter_ts <- function(bbs_data, start_yr, end_yr, min_num_yrs) { - sites_to_keep = bbs_data %>% - dplyr::filter(year >= start_yr, year <= end_yr) %>% - dplyr::group_by(site_id) %>% - dplyr::summarise(num_years = length(unique(year))) %>% - dplyr::ungroup() %>% - dplyr::filter(num_years >= min_num_yrs) - - filtered_data <- bbs_data %>% - dplyr::filter(year >= start_yr, year <= end_yr) %>% - dplyr::filter(site_id %in% sites_to_keep$site_id) -} - #' @title Create Sonoran desert lab time-series data #' #' @description Original data found here http://www.eebweb.arizona.edu/faculty/venable/LTREB/LTREB%20data.htm diff --git a/man/get_bbs_route_region_data.Rd b/man/get_bbs_route_region_data.Rd deleted file mode 100644 index ad89072..0000000 --- a/man/get_bbs_route_region_data.Rd +++ /dev/null @@ -1,22 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/get_retriever_data.R -\name{get_bbs_route_region_data} -\alias{get_bbs_route_region_data} -\title{Get BBS data by route and reigon} -\usage{ -get_bbs_route_region_data(route, region, path = get_default_data_path()) -} -\arguments{ -\item{route}{route} - -\item{region}{region} - -\item{path}{path} -} -\value{ -list of two dataframes (one with abundance data, the other with covariate data) - and one list of metadata. -} -\description{ -Get BBS data by route and reigon -} diff --git a/man/prepare_bbs_ts_data.Rd b/man/prepare_bbs_ts_data.Rd index e520446..9fe231b 100644 --- a/man/prepare_bbs_ts_data.Rd +++ b/man/prepare_bbs_ts_data.Rd @@ -16,12 +16,9 @@ prepare_bbs_ts_data(start_yr = 1965, end_yr = 2017, min_num_yrs = 10, \item{path}{where to load the raw data files from} } -\value{ -list of three dataframes (one with bbs data filtered to time series that meet the criteria, one with the BBS species table, and one with the routes and regions represented in the first dataframe). -} \description{ Modified from https://github.com/weecology/bbs-forecasting and https://github.com/weecology/MATSS-community-change Selects sites with data spanning start_yr through end_yr containing at least min_num_yrs of data -samples during that period. +samples during that period. Cleans data tables and stores each individual route as a .Rds file. Saves a data table of the route + region pairs. } diff --git a/man/subset_bbs_route_region_data.Rd b/man/subset_bbs_route_region_data.Rd new file mode 100644 index 0000000..1cd259d --- /dev/null +++ b/man/subset_bbs_route_region_data.Rd @@ -0,0 +1,26 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/get_retriever_data.R +\name{subset_bbs_route_region_data} +\alias{subset_bbs_route_region_data} +\title{Subset BBS data by route and reigon +Writes each route & region data object (a list of abundance, metadata, and covariates) as an .Rds file to be re-read via readRDS.} +\usage{ +subset_bbs_route_region_data(route_region, bbs_data_table, species_table, + path = get_default_data_path()) +} +\arguments{ +\item{route_region}{named list of route and region to subset to} + +\item{bbs_data_table}{main bbs data table} + +\item{species_table}{table of species for BBS} + +\item{path}{path} +} +\value{ +nothing +} +\description{ +Subset BBS data by route and reigon +Writes each route & region data object (a list of abundance, metadata, and covariates) as an .Rds file to be re-read via readRDS. +} diff --git a/man/ts_summary.Rd b/man/ts_summary.Rd index 14f1952..30dd61d 100644 --- a/man/ts_summary.Rd +++ b/man/ts_summary.Rd @@ -10,7 +10,8 @@ ts_summary(obs, times = NULL, effort = NULL, obs_per_effort = FALSE, interp_method = forecast::na.interp) uni_ts_summary(obs, times = NULL, effort = NULL, - obs_per_effort = FALSE, interp_method = forecast::na.interp) + obs_per_effort = !is.null(effort), + interp_method = forecast::na.interp) ts_summary_drake(x) } diff --git a/vignettes/.drake/config/compress b/vignettes/.drake/config/compress new file mode 100644 index 0000000..ef2f513 --- /dev/null +++ b/vignettes/.drake/config/compress @@ -0,0 +1 @@ +TRUE diff --git a/vignettes/.drake/config/hash_algorithm b/vignettes/.drake/config/hash_algorithm new file mode 100644 index 0000000..113c8a9 --- /dev/null +++ b/vignettes/.drake/config/hash_algorithm @@ -0,0 +1 @@ +xxhash64 diff --git a/vignettes/.drake/config/mangle_key b/vignettes/.drake/config/mangle_key new file mode 100644 index 0000000..f6d449c --- /dev/null +++ b/vignettes/.drake/config/mangle_key @@ -0,0 +1 @@ +FALSE diff --git a/vignettes/.drake/config/mangle_key_pad b/vignettes/.drake/config/mangle_key_pad new file mode 100644 index 0000000..f6d449c --- /dev/null +++ b/vignettes/.drake/config/mangle_key_pad @@ -0,0 +1 @@ +FALSE diff --git a/vignettes/.drake/config/version b/vignettes/.drake/config/version new file mode 100644 index 0000000..6085e94 --- /dev/null +++ b/vignettes/.drake/config/version @@ -0,0 +1 @@ +1.2.1 diff --git a/vignettes/.drake/data/052f671a04361c98.rds b/vignettes/.drake/data/052f671a04361c98.rds new file mode 100644 index 0000000000000000000000000000000000000000..6a60ee0cf3851ae8698966365c0a2c747a3588f4 GIT binary patch literal 464 zcmV;>0Wba^iwFP!000001FcgrOT$1EzP3r)6lsh82S-5{!6iC4iO@~AculU!VR8w% zt5O`DodpNQNhux0QJh3@5&wmgh?9fWT#`$Z*ir`rFS+;Kd*6NU-pg(s08j=MxeUq` zzFY`j&Cpt*m4F1)@T-`RL49Q^T94595o>M@{@r-q**{w6TNUoh+UM%l!`0ilc7Hri zPEXp}=I|)!kVTR|rkeF#NkdIPN>S6~8Cc`5pX4oSl)UYA3#J1#mCYm5X!T~N; z4`%z(1xQl|rI9Ha2w!V=wqM?_!SDTC<&t1yFt8At++c|}SOkWxWyp<-`-?Em=RyW! zVS9ODvCzT)3d>P7MKmAwiL^EB`d+|N-l~f!#l#Yc6pe?Sws^fZ~zh3@r)uV9*) zlqw6bWu+<$6V{9;3=yNR+mPA<#>DS2JtEG)t?-aZ_*|qZ&m8OQ^rC+djD7%@-7agA G1ONd48QmQK literal 0 HcmV?d00001 diff --git a/vignettes/.drake/data/23fbbc5bddad2ce9.rds b/vignettes/.drake/data/23fbbc5bddad2ce9.rds new file mode 100644 index 0000000000000000000000000000000000000000..d1de240719c68df50591e4ee7c4e40ce1b8e8e25 GIT binary patch literal 56 zcmb2|=3oE==I#ec2?+^F32CWG2}x{5k}M4~CN{P<3VRgKd@1=-@>Qgi#0&<8t&;8u H8bA#I(ZCSy literal 0 HcmV?d00001 diff --git a/vignettes/.drake/data/2c3d8028117512b7.rds b/vignettes/.drake/data/2c3d8028117512b7.rds new file mode 100644 index 0000000000000000000000000000000000000000..d369f11f68a70a7b4bd5f7c62fd583c4a545743f GIT binary patch literal 53 zcmb2|=3oE==I#ec2?+^F32CWG2}x{5k}M4~CN{P<3VUo8pZe@+>a(TH4D%OA2C4#8 F0|2N#5gz~m literal 0 HcmV?d00001 diff --git a/vignettes/.drake/data/2c697c6e11c14fba.rds b/vignettes/.drake/data/2c697c6e11c14fba.rds new file mode 100644 index 0000000000000000000000000000000000000000..9160273ee98a0ffc9112d29642e24b4d5fea8eaf GIT binary patch literal 465 zcmV;?0WSU@iwFP!000001FcgrOT$1Iy|!uE6tM+22i+Wn4kEaO&LZgM7Ou%PImsm< zcU6mnT^s~AHy2ltjt(6}97LS`7vkjTQq5g*X%brM;KAkYz5DLF_uai5HUI!+P^p$d zxx%L_(We>pR@6&C0a`Sw7G%(9&t)5ejhmeFzRbtY%huWYkS|p@uIk^bw@=4!5BhWG za(nmnPM?eqJ}=hB`i-D>^wFr^-uM^*pp-MGRXs=$O(awkQtML`Zc^m-5~5BAG>dD< zg#krY0vjUUbg(NKjctneq6fzjhKMB?)PB+JT$UkE0@m%uK+ Hlmq|(B!k*G literal 0 HcmV?d00001 diff --git a/vignettes/.drake/data/3a8c46c97499a3c1.rds b/vignettes/.drake/data/3a8c46c97499a3c1.rds new file mode 100644 index 0000000000000000000000000000000000000000..669295f3e0d74b11e97ab878d9a61b7e6cebfc16 GIT binary patch literal 52 zcmb2|=3oE==I#ec2?+^F32CWG2}x{5k}M4~CN{P<3VUo`s+#s}$ub6pb5B=pQ~@dm E0G5amcmMzZ literal 0 HcmV?d00001 diff --git a/vignettes/.drake/data/697685ec6b4d717c.rds b/vignettes/.drake/data/697685ec6b4d717c.rds new file mode 100644 index 0000000000000000000000000000000000000000..e7182fc70c87d59dda02e07d477d89ed0858d21a GIT binary patch literal 150 zcmV;H0BQdpiwFP!000001B>8dU|?WkU}j}vU}6R`nT5f81_l8jW@TVu-~`ev1v!a% zP&QjiVo74WAqvk3uN--1apYFU=jNxR=0N#eKz?y)Zf;^xCD0I%3mKs@ta*vKsl`xh zm|)hV73Jqb*-Rz*Xj(Xn^2_y*wb9UZ$vKI|Fl%6fTp+{r(u#mC0P_9;04o}-(S-p3 E05CB?RsaA1 literal 0 HcmV?d00001 diff --git a/vignettes/.drake/data/6d6f4d10f2d3a386.rds b/vignettes/.drake/data/6d6f4d10f2d3a386.rds new file mode 100644 index 0000000000000000000000000000000000000000..47d85effc81998af173bf29d1573c0e3a27df83c GIT binary patch literal 579 zcmV-J0=)eniwFP!000001MODNZ<{a_c7TwCE^XKLI*CiARN5ugPL;ZUVwc^J10Ju~Wr{_uq^Q$&S7+P0@r<3*0&`M>!}fZzoe!=;7<$FKyX%59oC$`D+)@VQ zS0%u)XStZNGR4fXF!|FfCk&0WUKG0YC$g(TL%_3vDg2$cc1EF{ivLg(Uhp zQc=~(W=omYT!BGSOLfO0qrZpUOTA_q%%q@sP6Rxjb{_4NPI_&h*S-;MAl{nIr-Hr! z!y$WDi?l7^&To211TarEGypqcvzKQe&yVo=kKi-syQEE*A?u)F9664NM>IZYd|n-# zJsGX5{*A#{uYh_0+%?qM2CL_U`T9BSs4t$bQ_ji_X7zBY5?+d(16iLKU#Udm$GDCC zbKH83@8jP2&D-eE$_qn|Kt6%_L$j~dQpu+leU21*?-Ys@h3c((M~5wwF8=k`>wV|X zGzt!nZkuQGT$I}?+3YNf*|&-YvVf;GQ-9D#%8|%LG zZemrWSm(Qf1aCU+D3w(k`#&J#nL|D|bRR*!Fo_6jm#}u_AnB2)?}(_Q*aPcpF-Ecd R9dwcU=`W`KiL@LH0006|9dQ5v literal 0 HcmV?d00001 diff --git a/vignettes/.drake/data/7a71b3f7028b8f92.rds b/vignettes/.drake/data/7a71b3f7028b8f92.rds new file mode 100644 index 0000000000000000000000000000000000000000..59b489a476776b57800ebe6e933a4162401ac7b3 GIT binary patch literal 120 zcmb2|=3oE==I#ec2?+^F32CWG2}x{*t&J?oQ`k5;8h+~V%yF2tR6*U4-=q17Lj(6B zv6jdg6RvE0ruuA|n6s&|GwV$+q3%n;-V1EjO}Wza=*N;vXXc2k;BZgNbF2&W%;K8x Xmp@72alH)R4|axgAs=sS2U-XK^HVNm literal 0 HcmV?d00001 diff --git a/vignettes/.drake/data/8271c9325d9ef093.rds b/vignettes/.drake/data/8271c9325d9ef093.rds new file mode 100644 index 0000000000000000000000000000000000000000..d6f5340f674f3e85622b6cb72cba11c7e7f04e65 GIT binary patch literal 40 qcmb2|=3oE==I#ec2?+^F32CWG2}x{5k`6U)0&EPH*|$QZfC>P_zX_=T literal 0 HcmV?d00001 diff --git a/vignettes/.drake/data/8e42b9635a511761.rds b/vignettes/.drake/data/8e42b9635a511761.rds new file mode 100644 index 0000000000000000000000000000000000000000..a1d9ab2b7b7bddad0bab49e41265259dc1a4bdeb GIT binary patch literal 528 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 c++<$-gw{06T~{W#R+?071zNssI20 literal 0 HcmV?d00001 diff --git a/vignettes/.drake/data/997f44f13ddf401c.rds b/vignettes/.drake/data/997f44f13ddf401c.rds new file mode 100644 index 0000000000000000000000000000000000000000..cff74d9e14b1f69405e14a6df18826f1a4375157 GIT binary patch literal 50 zcmb2|=3oE==I#ec2?+^F32CWG2}x{5k}M4~CN{P<3VUo`^5pqaCWh75H$74UDg^*~ CUlBC` literal 0 HcmV?d00001 diff --git a/vignettes/.drake/data/b87d23767f391c18.rds b/vignettes/.drake/data/b87d23767f391c18.rds new file mode 100644 index 0000000000000000000000000000000000000000..7348de6c71b080f706843489e4475b8794d02ed1 GIT binary patch literal 285 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 literal 0 HcmV?d00001 diff --git a/vignettes/.drake/data/c40c00762a0dac94.rds b/vignettes/.drake/data/c40c00762a0dac94.rds new file mode 100644 index 0000000000000000000000000000000000000000..93339bda9e5d7ce41bf3131794b3b375843ee6d2 GIT binary patch literal 41 scmb2|=3oE==I#ec2?+^F32CWG2}x{5l0O<|Ol0I@Sh4*rlN?Y50OnH*y#N3J literal 0 HcmV?d00001 diff --git a/vignettes/.drake/data/c82520a724587517.rds b/vignettes/.drake/data/c82520a724587517.rds new file mode 100644 index 0000000000000000000000000000000000000000..2868ee813815265ddfa47b2dc72b1a8bd104a0d3 GIT binary patch literal 326 zcmV-M0lEGkiwFP!000001B>8dU|?WkU}j}vU}6R`nT3G_E0E>|ae$Z+EDvV0FoF3j z44gokEhn`sHK!QJ5&+9WMT=8Q@{1FpJg&0TqTI=(US@J4nsKbj zIf=zE)8KZbB_@{u^)fL017bdqJq{vlDtGmz7C4CSD?72pGQvSBN@fj*p*mciJEz-u zY9pHio5t5e{V|#j?57Si3+2s#$=iQV0c&s&S#CA;T{29jt`UaWs0QdnIRASIhEptO% znFQHZnDP`z@FqM$r7~i~45=>=R8$oeCB3%Sw_BEbWyZPE&CdQgYp=b}x#t}J)J!R5 zsZz^QRw@3i>=%D(#k*6yFZ&0li>JT;YW}?L@BKD^-uCxoKS+zGe~91gyRtK$xc&Q! zC*-c=ZOM-E5DyRR=>Z7x4shJQYkY{?vwj2*=V^5u8vkR- zBjMbUghvlv;(bJ)71x6o^(+3i{9Wl?`YqX`57L>ZuG_(pPX5r1#~t~>?;3yVLPlO& zcj!H<8(xmnwK`%xZJi;h)7K$+z&Wh$@-e^>hVlK6d|J#{zmd4|+8-ClqZ*bwUqrM=)0T(_^^Mk)_c<5di_O@`^vg0Qn9P*as$%NzMsH1K= zan#i`yYmHq(zW~V>V2b1uQ^HuTO zAK=4%vxBa2J>%>5H0~+!J3@BuhkieIzu#Np{wRCgw@r`xB=f~Qmek?*u#WLY_xpOs z@DEGIuk=y;{PzL6{oYFKTfgc%S|{I2zSH;Y{x>D#-jw*?n*`UT$D@DH_g=>HTk9#~ z{jK$t@%>%;y1u#e{ml1A*FS6ArP;x`G#qsN9`AAJoI77^e_prGBg@X8kH#My>hg1N z-Fd-y@}hfxoG%hS(mDS*fBH#r>O(R4( zIGQJ!XU?vTTl4W?HaIz*6g-SuV{-od1b*{RGJ8?{xxT*sWnRcX->#n!ofZH95GY+B literal 0 HcmV?d00001 diff --git a/vignettes/.drake/data/f4b89e63bc92af79.rds b/vignettes/.drake/data/f4b89e63bc92af79.rds new file mode 100644 index 0000000000000000000000000000000000000000..44e7e605ed608db5ad0c12aa7eae1076125aa669 GIT binary patch literal 1217 zcmV;y1U~y8iwFP!000001Fcq1OdM4hAC?7n*=4&3B=%D0;Gr59c6Jw}YTc&`hz*St z43L&IdF&1_I?OC@W*4C~;nH*CvBrZ*J(?c$!m+W5Cr$L!o3R%!)`Y~=sELg;^M2pZ z9o&NAOP1gJe((G9`@T2J>{73yC^4n8E2hLcy=~`!_b26jGTujJqe`$s9Q(#!-?Guw zV6noNMSrov>093Vn7wpM;yBL9zbF^eVCQkJ%}9F~_VYL=%z;M&_Bz?WN_%uy>KcJQ z%JU+0P~BHi=N0%-o)PjxAH&qIJP+saEO^3f#8%tb**5-BzvE&wUljjq{1N&UnnMjd z;T2$A2C(L?L^EQqEXa9t%)5sBBiwvV-cJ-iMEv!;60gCY|6HEWJ(PIqYnlIQw?yYh z>E}RS1NJuTdE~n~AnPw8zOfIz&@aA&A8Vb%73d&bWUaQ2dY8dlpGtfO^%tpr1Xp+e z84bk0hrA~IXK{W3d1p~?3Al2%6-fu_qxc1!FC(rV>BHSefAU^z#jNYWeJ=uWl|M!om@t0H^&C{f(^_1)pj1RK0I$>edy^!9OLO))FGm&Rq?5zM26e#U;ndjqgRP-I<(^(biSr@LHjBfD-l^qVQ&pTDNUt= zi+rcX)w!h-h`x|e7dff!o#3w1u+*2eJebV1EiBztOX`F$nmX8iu=90WxO~NKkp7+p zZW`Qj!+Z_L)rDFd%ZEC2QB@12`~--EB#QY~dpr^_p07~OfGCaT=O+&_Ghk8&423;Y z;WfiFc~zYv?HW!7W(=!po0eL!E!VJg%jI-+{grjG?U-H%Z*SCfVT1>XDTBMJ zRv4#()3)VJvtl$2y1vZ2_O|VMoGomxE{**O)*>=HVb|7lwX)7lQ@7T1y5ZCt7c1%o z-qcOQqFyU}g9}@|9G1?``m+7L456 Date: Mon, 27 May 2019 12:57:25 -0400 Subject: [PATCH 24/35] Add option to work with a subset of BBS data and fix passing the path argument around in build_plans --- NAMESPACE | 1 + R/bbs_cleaning_functions.R | 9 ++++++--- R/build_plans.R | 21 ++++++++++++++------- man/build_bbs_datasets_plan.Rd | 2 +- man/build_datasets_plan.Rd | 5 ++++- man/filter_ts.Rd | 2 +- man/get_bbs_route_region_data.Rd | 21 +++++++++++++++++++++ man/prepare_bbs_ts_data.Rd | 6 ++++-- man/subset_bbs_route_region_data.Rd | 2 +- 9 files changed, 53 insertions(+), 16 deletions(-) create mode 100644 man/get_bbs_route_region_data.Rd diff --git a/NAMESPACE b/NAMESPACE index 20abaa6..707099f 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -11,6 +11,7 @@ export(collect_analyses) export(combine_subspecies) export(filter_bbs_species) export(filter_ts) +export(get_bbs_route_region_data) export(get_cowley_lizards) export(get_cowley_snakes) export(get_default_data_path) diff --git a/R/bbs_cleaning_functions.R b/R/bbs_cleaning_functions.R index 13d7568..8413de9 100644 --- a/R/bbs_cleaning_functions.R +++ b/R/bbs_cleaning_functions.R @@ -6,12 +6,13 @@ #' @param start_yr num first year of time-series #' @param end_yr num last year of time-series #' @param min_num_yrs num minimum number of years of data between start_yr & end_yr +#' @param selected_set optional, a subset of the BBS communities to use (to speed up development). As c(1:X) #' @inheritParams get_mtquad_data #' @return NULL #' @export prepare_bbs_ts_data <- function(start_yr = 1965, end_yr = 2017, min_num_yrs = 10, - path = get_default_data_path()){ + path = get_default_data_path(), selected_set = NULL){ bbs_data_tables <- import_retriever_data("breed-bird-survey", path = path) bbs_data <- bbs_data_tables$breed_bird_survey_weather %>% @@ -48,6 +49,10 @@ prepare_bbs_ts_data <- function(start_yr = 1965, end_yr = 2017, min_num_yrs = 10 } bbs_routes_regions_list = apply(bbs_routes_regions, MARGIN = 1, FUN = make_list) + if(!is.null(selected_set)) { + bbs_routes_regions_list = bbs_routes_regions_list[selected_set] + } + lapply(bbs_routes_regions_list, FUN = subset_bbs_route_region_data, bbs_data_table = bbs_data, species_table = bbs_data_tables$breed_bird_survey_species, path = path) } @@ -105,8 +110,6 @@ subset_bbs_route_region_data <- function(route_region, bbs_data_table, species_t saveRDS(this_bbs_result, file = file.path(storage_path, paste0("route", route, "region", region, ".Rds")) ) - return() - } diff --git a/R/build_plans.R b/R/build_plans.R index 942d927..c10eb99 100644 --- a/R/build_plans.R +++ b/R/build_plans.R @@ -65,6 +65,7 @@ build_analyses_plan <- function(methods, datasets, ...) #' @param data_path where to get the downloaded retriever datasets #' @param include_downloaded_data whether to also include downloadable datasets #' @param include_bbs_data whether to include BBS data +#' @param bbs_subset optional, a subset of the BBS communities to use (to speed up development). As c(1:X) #' #' @return a drake plan (i.e. a tibble) specifying the targets and commands #' for gathering datasets @@ -73,7 +74,8 @@ build_analyses_plan <- function(methods, datasets, ...) #' build_datasets_plan <- function(data_path = get_default_data_path(), include_downloaded_data = FALSE, - include_bbs_data = FALSE) + include_bbs_data = FALSE, + bbs_subset = NULL) { datasets <- drake::drake_plan( maizuru_data = get_maizuru_data(), @@ -97,7 +99,12 @@ build_datasets_plan <- function(data_path = get_default_data_path(), } if (include_bbs_data) { - bbs_datasets = build_bbs_datasets_plan() + bbs_datasets = build_bbs_datasets_plan(data_path = data_path) + + if(!is.null(bbs_subset)) { + bbs_datasets = bbs_datasets[bbs_subset, ] + } + datasets <- datasets %>% dplyr::bind_rows(bbs_datasets) } @@ -107,7 +114,7 @@ build_datasets_plan <- function(data_path = get_default_data_path(), #' @title Generate a Drake Plan for BBS Datasets #' -#' @param data_path path +#' @param path path #' @param from_raw whether to re-prep BBS data #' #' @return a drake plan (i.e. a tibble) specifying the targets and commands @@ -115,19 +122,19 @@ build_datasets_plan <- function(data_path = get_default_data_path(), #' #' @export #' -build_bbs_datasets_plan <- function(path = get_default_data_path()) +build_bbs_datasets_plan <- function(data_path = get_default_data_path()) { - if(!file.exists(file.path(path, "breed-bird-survey-prepped", "routes_and_regions_table.csv"))) { + if(!file.exists(file.path(data_path, "breed-bird-survey-prepped", "routes_and_regions_table.csv"))) { prepare_bbs_ts_data() } - routes_and_regions = read.csv(file.path(path, "breed-bird-survey-prepped", "routes_and_regions_table.csv"), stringsAsFactors = F) + routes_and_regions = read.csv(file.path(data_path, "breed-bird-survey-prepped", "routes_and_regions_table.csv"), stringsAsFactors = F) routes_and_regions = routes_and_regions %>% dplyr::mutate(bcr = as.character(bcr), route = as.character(route)) bbs_datasets <- drake::drake_plan( - bbs_data_rtrg = target(get_bbs_route_region_data(route, region, path = get_default_data_path()), + bbs_data_rtrg = target(get_bbs_route_region_data(route, region, path = !!data_path), transform = map(route = !!rlang::syms(routes_and_regions$route), region = !!rlang::syms(routes_and_regions$bcr) ) diff --git a/man/build_bbs_datasets_plan.Rd b/man/build_bbs_datasets_plan.Rd index 26d4d40..b243ffc 100644 --- a/man/build_bbs_datasets_plan.Rd +++ b/man/build_bbs_datasets_plan.Rd @@ -7,7 +7,7 @@ build_bbs_datasets_plan(path = get_default_data_path()) } \arguments{ -\item{data_path}{path} +\item{path}{path} \item{from_raw}{whether to re-prep BBS data} } diff --git a/man/build_datasets_plan.Rd b/man/build_datasets_plan.Rd index c3581cf..ce7db31 100644 --- a/man/build_datasets_plan.Rd +++ b/man/build_datasets_plan.Rd @@ -5,7 +5,8 @@ \title{Generate a Drake Plan for Datasets} \usage{ build_datasets_plan(data_path = get_default_data_path(), - include_downloaded_data = FALSE, include_bbs_data = FALSE) + include_downloaded_data = FALSE, include_bbs_data = FALSE, + bbs_subset = NULL) } \arguments{ \item{data_path}{where to get the downloaded retriever datasets} @@ -13,6 +14,8 @@ build_datasets_plan(data_path = get_default_data_path(), \item{include_downloaded_data}{whether to also include downloadable datasets} \item{include_bbs_data}{whether to include BBS data} + +\item{bbs_subset}{optional, a subset of the BBS communities to use (to speed up development). As c(1:X)} } \value{ a drake plan (i.e. a tibble) specifying the targets and commands diff --git a/man/filter_ts.Rd b/man/filter_ts.Rd index 4e7c113..0fb3756 100644 --- a/man/filter_ts.Rd +++ b/man/filter_ts.Rd @@ -1,5 +1,5 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/get_retriever_data.R +% Please edit documentation in R/bbs_cleaning_functions.R \name{filter_ts} \alias{filter_ts} \title{Filter BBS to specified time series period and number of samples} diff --git a/man/get_bbs_route_region_data.Rd b/man/get_bbs_route_region_data.Rd new file mode 100644 index 0000000..534bac1 --- /dev/null +++ b/man/get_bbs_route_region_data.Rd @@ -0,0 +1,21 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/get_retriever_data.R +\name{get_bbs_route_region_data} +\alias{get_bbs_route_region_data} +\title{Get cleaned BBS data} +\usage{ +get_bbs_route_region_data(route, region, path = get_default_data_path()) +} +\arguments{ +\item{route}{Route number} + +\item{region}{Region number} + +\item{path}{Data storage path} +} +\value{ +list of abundance, covariates, and metadata +} +\description{ +Gets prepped BBS data (as a list of abundance, covariates, and metadata) for a specified route and region. First run `prepare_bbs_data` to create these files from the raw BBS data tables +} diff --git a/man/prepare_bbs_ts_data.Rd b/man/prepare_bbs_ts_data.Rd index 9fe231b..d889085 100644 --- a/man/prepare_bbs_ts_data.Rd +++ b/man/prepare_bbs_ts_data.Rd @@ -1,11 +1,11 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/get_retriever_data.R +% Please edit documentation in R/bbs_cleaning_functions.R \name{prepare_bbs_ts_data} \alias{prepare_bbs_ts_data} \title{Prepare BBS population time-series data} \usage{ prepare_bbs_ts_data(start_yr = 1965, end_yr = 2017, min_num_yrs = 10, - path = get_default_data_path()) + path = get_default_data_path(), selected_set = NULL) } \arguments{ \item{start_yr}{num first year of time-series} @@ -15,6 +15,8 @@ prepare_bbs_ts_data(start_yr = 1965, end_yr = 2017, min_num_yrs = 10, \item{min_num_yrs}{num minimum number of years of data between start_yr & end_yr} \item{path}{where to load the raw data files from} + +\item{selected_set}{optional, a subset of the BBS communities to use (to speed up development). As c(1:X)} } \description{ Modified from https://github.com/weecology/bbs-forecasting diff --git a/man/subset_bbs_route_region_data.Rd b/man/subset_bbs_route_region_data.Rd index 1cd259d..e5d7370 100644 --- a/man/subset_bbs_route_region_data.Rd +++ b/man/subset_bbs_route_region_data.Rd @@ -1,5 +1,5 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/get_retriever_data.R +% Please edit documentation in R/bbs_cleaning_functions.R \name{subset_bbs_route_region_data} \alias{subset_bbs_route_region_data} \title{Subset BBS data by route and reigon From ac3f45e3a6a1147ce691c8e6e5df3798ba8255e5 Mon Sep 17 00:00:00 2001 From: Renata Diaz Date: Mon, 27 May 2019 13:15:53 -0400 Subject: [PATCH 25/35] Speed up prepare_bbs_ts_data' --- R/bbs_cleaning_functions.R | 10 +++++++++- man/build_bbs_datasets_plan.Rd | 2 +- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/R/bbs_cleaning_functions.R b/R/bbs_cleaning_functions.R index 8413de9..e72a4b4 100644 --- a/R/bbs_cleaning_functions.R +++ b/R/bbs_cleaning_functions.R @@ -53,7 +53,15 @@ prepare_bbs_ts_data <- function(start_yr = 1965, end_yr = 2017, min_num_yrs = 10 bbs_routes_regions_list = bbs_routes_regions_list[selected_set] } - lapply(bbs_routes_regions_list, FUN = subset_bbs_route_region_data, bbs_data_table = bbs_data, species_table = bbs_data_tables$breed_bird_survey_species, path = path) + # lapply(bbs_routes_regions_list, FUN = subset_bbs_route_region_data, bbs_data_table = bbs_data, species_table = bbs_data_tables$breed_bird_survey_species, path = path) + + for(i in 1:length(bbs_routes_regions_list)) { + this_bbs_subset = bbs_data %>% + dplyr::filter(bcr == bbs_routes_regions_list[[i]]$region, + route == bbs_routes_regions_list[[i]]$route) + + subset_bbs_route_region_data(route_region = bbs_routes_regions_list[[i]], bbs_data_table = this_bbs_subset, species_table = bbs_data_tables$breed_bird_survey_species, path = path) + } } diff --git a/man/build_bbs_datasets_plan.Rd b/man/build_bbs_datasets_plan.Rd index b243ffc..1a34b33 100644 --- a/man/build_bbs_datasets_plan.Rd +++ b/man/build_bbs_datasets_plan.Rd @@ -4,7 +4,7 @@ \alias{build_bbs_datasets_plan} \title{Generate a Drake Plan for BBS Datasets} \usage{ -build_bbs_datasets_plan(path = get_default_data_path()) +build_bbs_datasets_plan(data_path = get_default_data_path()) } \arguments{ \item{path}{path} From 58b9b7a54c6f4442230ba43ea9bb054f1026ef3a Mon Sep 17 00:00:00 2001 From: Hao Ye Date: Tue, 28 May 2019 11:02:43 -0400 Subject: [PATCH 26/35] update subset_bbs_route_region_data function - change name - remove dependency on route and region argument, check and generate this from the passed in data --- NAMESPACE | 2 +- R/bbs_cleaning_functions.R | 26 +++++++++++++++----------- man/process_bbs_route_region_data.Rd | 27 +++++++++++++++++++++++++++ man/subset_bbs_route_region_data.Rd | 26 -------------------------- 4 files changed, 43 insertions(+), 38 deletions(-) create mode 100644 man/process_bbs_route_region_data.Rd delete mode 100644 man/subset_bbs_route_region_data.Rd diff --git a/NAMESPACE b/NAMESPACE index 707099f..05fbcff 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -27,8 +27,8 @@ export(import_retriever_data) export(install_retriever_data) export(interpolate_obs) export(prepare_bbs_ts_data) +export(process_bbs_route_region_data) export(richness) -export(subset_bbs_route_region_data) export(summarise_effort) export(summarise_obs) export(summarise_times) diff --git a/R/bbs_cleaning_functions.R b/R/bbs_cleaning_functions.R index e72a4b4..030de25 100644 --- a/R/bbs_cleaning_functions.R +++ b/R/bbs_cleaning_functions.R @@ -66,22 +66,28 @@ prepare_bbs_ts_data <- function(start_yr = 1965, end_yr = 2017, min_num_yrs = 10 } -#' Subset BBS data by route and reigon -#' Writes each route & region data object (a list of abundance, metadata, and covariates) as an .Rds file to be re-read via readRDS. +#' @title Process the BBS data for an individual route and region +#' @description Correct and otherwise filter BBS species data (see +#' \code{\link{combine_subspecies}} and \code{\link{filter_bbs_species}} for +#' more info). Generate the abundance, covariate, and metadata tables and +#' write the output into an .Rds file to be re-read via readRDS. #' @param route_region named list of route and region to subset to #' @param bbs_data_table main bbs data table #' @param species_table table of species for BBS #' @param path path #' @return nothing #' @export -subset_bbs_route_region_data <- function(route_region, bbs_data_table, species_table, - path = get_default_data_path()) { - - route = as.numeric(route_region$route) - region = as.numeric(route_region$region) - +process_bbs_route_region_data <- function(bbs_data_table, species_table, + path = get_default_data_path()) +{ + # check that exactly one route and one region are represented in the data + route <- unique(bbs_data_table$route) + region <- unique(bbs_data_table$bcr) + stopifnot(length(route) == 1 && + length(region == 1)) + + # process species IDs this_bbs_data <- bbs_data_table %>% - dplyr::filter(bcr == region, route == route) %>% combine_subspecies(species_table = species_table) %>% filter_bbs_species(species_table = species_table) %>% dplyr::mutate(species_id = paste('sp', species_id, sep=''), @@ -107,7 +113,6 @@ subset_bbs_route_region_data <- function(route_region, bbs_data_table, species_t metadata <- list(timename = 'year', effort = 'effort', route = route, region = region) - if(!dir.exists(file.path(path, 'breed-bird-survey-prepped'))) { dir.create(file.path(path, 'breed-bird-survey-prepped')) } @@ -117,7 +122,6 @@ subset_bbs_route_region_data <- function(route_region, bbs_data_table, species_t this_bbs_result = list('abundance' = abundance, 'covariates' = covariates, 'metadata' = metadata) saveRDS(this_bbs_result, file = file.path(storage_path, paste0("route", route, "region", region, ".Rds")) ) - } diff --git a/man/process_bbs_route_region_data.Rd b/man/process_bbs_route_region_data.Rd new file mode 100644 index 0000000..e658ec1 --- /dev/null +++ b/man/process_bbs_route_region_data.Rd @@ -0,0 +1,27 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/bbs_cleaning_functions.R +\name{process_bbs_route_region_data} +\alias{process_bbs_route_region_data} +\title{Process the BBS data for an individual route and region} +\usage{ +process_bbs_route_region_data(bbs_data_table, species_table, + path = get_default_data_path()) +} +\arguments{ +\item{bbs_data_table}{main bbs data table} + +\item{species_table}{table of species for BBS} + +\item{path}{path} + +\item{route_region}{named list of route and region to subset to} +} +\value{ +nothing +} +\description{ +Correct and otherwise filter BBS species data (see + \code{\link{combine_subspecies}} and \code{\link{filter_bbs_species}} for + more info). Generate the abundance, covariate, and metadata tables and + write the output into an .Rds file to be re-read via readRDS. +} diff --git a/man/subset_bbs_route_region_data.Rd b/man/subset_bbs_route_region_data.Rd deleted file mode 100644 index e5d7370..0000000 --- a/man/subset_bbs_route_region_data.Rd +++ /dev/null @@ -1,26 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/bbs_cleaning_functions.R -\name{subset_bbs_route_region_data} -\alias{subset_bbs_route_region_data} -\title{Subset BBS data by route and reigon -Writes each route & region data object (a list of abundance, metadata, and covariates) as an .Rds file to be re-read via readRDS.} -\usage{ -subset_bbs_route_region_data(route_region, bbs_data_table, species_table, - path = get_default_data_path()) -} -\arguments{ -\item{route_region}{named list of route and region to subset to} - -\item{bbs_data_table}{main bbs data table} - -\item{species_table}{table of species for BBS} - -\item{path}{path} -} -\value{ -nothing -} -\description{ -Subset BBS data by route and reigon -Writes each route & region data object (a list of abundance, metadata, and covariates) as an .Rds file to be re-read via readRDS. -} From 2601532ce917b9c75a6782576722a4fd7526109a Mon Sep 17 00:00:00 2001 From: Hao Ye Date: Tue, 28 May 2019 11:20:45 -0400 Subject: [PATCH 27/35] simplify looping paradigm for processing bbs route and regions --- R/bbs_cleaning_functions.R | 60 +++++++++++++++++++------------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/R/bbs_cleaning_functions.R b/R/bbs_cleaning_functions.R index 030de25..43a56a9 100644 --- a/R/bbs_cleaning_functions.R +++ b/R/bbs_cleaning_functions.R @@ -1,18 +1,22 @@ #' @title Prepare BBS population time-series data #' @description Modified from https://github.com/weecology/bbs-forecasting -#' and https://github.com/weecology/MATSS-community-change -#' Selects sites with data spanning start_yr through end_yr containing at least min_num_yrs of data -#' samples during that period. Cleans data tables and stores each individual route as a .Rds file. Saves a data table of the route + region pairs. +#' and https://github.com/weecology/MATSS-community-change +#' Selects sites with data spanning start_yr through end_yr containing at +#' least min_num_yrs of data samples during that period. Cleans data tables +#' and stores each individual route as a .Rds file. Saves a data table of the +#' route + region pairs. #' @param start_yr num first year of time-series #' @param end_yr num last year of time-series #' @param min_num_yrs num minimum number of years of data between start_yr & end_yr -#' @param selected_set optional, a subset of the BBS communities to use (to speed up development). As c(1:X) +#' @param selected_set optional, a subset of the BBS communities to use +#' (to speed up development). As c(1:X) #' @inheritParams get_mtquad_data #' @return NULL #' @export prepare_bbs_ts_data <- function(start_yr = 1965, end_yr = 2017, min_num_yrs = 10, - path = get_default_data_path(), selected_set = NULL){ + path = get_default_data_path(), selected_set = NULL) +{ bbs_data_tables <- import_retriever_data("breed-bird-survey", path = path) bbs_data <- bbs_data_tables$breed_bird_survey_weather %>% @@ -32,37 +36,33 @@ prepare_bbs_ts_data <- function(start_yr = 1965, end_yr = 2017, min_num_yrs = 10 abundance = speciestotal) %>% MATSS::filter_ts(start_yr, end_yr, min_num_yrs) - + # prepare and write out route and region metadata bbs_routes_regions <- bbs_data %>% dplyr::select(bcr, route) %>% dplyr::distinct() %>% dplyr::mutate(name = paste0("bbs_bcr", bcr, "_route", route)) - if(!dir.exists(file.path(path, 'breed-bird-survey-prepped'))) { - dir.create(file.path(path, 'breed-bird-survey-prepped')) - } - - write.csv(bbs_routes_regions, file.path(path, "breed-bird-survey-prepped", "routes_and_regions_table.csv"), row.names = F) - - make_list <- function(bbs_line) { - return(list(route = as.numeric(bbs_line[2]), region = as.numeric(bbs_line[1]))) + storage_path <- file.path(path, 'breed-bird-survey-prepped') + if (!dir.exists(storage_path)) { + dir.create(storage_path) } - bbs_routes_regions_list = apply(bbs_routes_regions, MARGIN = 1, FUN = make_list) - if(!is.null(selected_set)) { - bbs_routes_regions_list = bbs_routes_regions_list[selected_set] - } - - # lapply(bbs_routes_regions_list, FUN = subset_bbs_route_region_data, bbs_data_table = bbs_data, species_table = bbs_data_tables$breed_bird_survey_species, path = path) + write.csv(bbs_routes_regions, file.path(storage_path, "routes_and_regions_table.csv"), row.names = F) - for(i in 1:length(bbs_routes_regions_list)) { - this_bbs_subset = bbs_data %>% - dplyr::filter(bcr == bbs_routes_regions_list[[i]]$region, - route == bbs_routes_regions_list[[i]]$route) - - subset_bbs_route_region_data(route_region = bbs_routes_regions_list[[i]], bbs_data_table = this_bbs_subset, species_table = bbs_data_tables$breed_bird_survey_species, path = path) + # filter and process selected route and region combinations + if (!is.null(selected_set)) { + bbs_routes_regions <- bbs_routes_regions[selected_set, ] } + bbs_routes_regions %>% + dplyr::select(bcr, route) %>% + purrr::pmap(function(bcr, route) { + bbs_data %>% + dplyr::filter(bcr == !!bcr, + route == !!route) %>% + process_bbs_route_region_data(species_table = bbs_data_tables$breed_bird_survey_species, + path = path) + }) } @@ -113,12 +113,12 @@ process_bbs_route_region_data <- function(bbs_data_table, species_table, metadata <- list(timename = 'year', effort = 'effort', route = route, region = region) - if(!dir.exists(file.path(path, 'breed-bird-survey-prepped'))) { - dir.create(file.path(path, 'breed-bird-survey-prepped')) + storage_path <- file.path(path, 'breed-bird-survey-prepped') + + if (!dir.exists(storage_path)) { + dir.create(storage_path) } - storage_path = file.path(path, 'breed-bird-survey-prepped') - this_bbs_result = list('abundance' = abundance, 'covariates' = covariates, 'metadata' = metadata) saveRDS(this_bbs_result, file = file.path(storage_path, paste0("route", route, "region", region, ".Rds")) ) From 93782a91b9feafd41aff753869dbccc8ef5dd86f Mon Sep 17 00:00:00 2001 From: Hao Ye Date: Tue, 28 May 2019 11:24:59 -0400 Subject: [PATCH 28/35] return data from process_bbs function save data in prepare_bbs function --- R/bbs_cleaning_functions.R | 22 +++++----------------- man/prepare_bbs_ts_data.Rd | 11 +++++++---- man/process_bbs_route_region_data.Rd | 9 ++------- 3 files changed, 14 insertions(+), 28 deletions(-) diff --git a/R/bbs_cleaning_functions.R b/R/bbs_cleaning_functions.R index 43a56a9..41bf1ac 100644 --- a/R/bbs_cleaning_functions.R +++ b/R/bbs_cleaning_functions.R @@ -60,25 +60,21 @@ prepare_bbs_ts_data <- function(start_yr = 1965, end_yr = 2017, min_num_yrs = 10 bbs_data %>% dplyr::filter(bcr == !!bcr, route == !!route) %>% - process_bbs_route_region_data(species_table = bbs_data_tables$breed_bird_survey_species, - path = path) + process_bbs_route_region_data(species_table = bbs_data_tables$breed_bird_survey_species) %>% + saveRDS(file = file.path(storage_path, paste0("route", route, "region", bcr, ".Rds")) ) }) } - #' @title Process the BBS data for an individual route and region #' @description Correct and otherwise filter BBS species data (see #' \code{\link{combine_subspecies}} and \code{\link{filter_bbs_species}} for #' more info). Generate the abundance, covariate, and metadata tables and #' write the output into an .Rds file to be re-read via readRDS. -#' @param route_region named list of route and region to subset to #' @param bbs_data_table main bbs data table #' @param species_table table of species for BBS -#' @param path path -#' @return nothing +#' @return the processed BBS data #' @export -process_bbs_route_region_data <- function(bbs_data_table, species_table, - path = get_default_data_path()) +process_bbs_route_region_data <- function(bbs_data_table, species_table) { # check that exactly one route and one region are represented in the data route <- unique(bbs_data_table$route) @@ -112,16 +108,8 @@ process_bbs_route_region_data <- function(bbs_data_table, species_table, dplyr::arrange(year) metadata <- list(timename = 'year', effort = 'effort', route = route, region = region) - - storage_path <- file.path(path, 'breed-bird-survey-prepped') - if (!dir.exists(storage_path)) { - dir.create(storage_path) - } - - this_bbs_result = list('abundance' = abundance, 'covariates' = covariates, 'metadata' = metadata) - - saveRDS(this_bbs_result, file = file.path(storage_path, paste0("route", route, "region", region, ".Rds")) ) + return(list('abundance' = abundance, 'covariates' = covariates, 'metadata' = metadata)) } diff --git a/man/prepare_bbs_ts_data.Rd b/man/prepare_bbs_ts_data.Rd index d889085..ccaa9a7 100644 --- a/man/prepare_bbs_ts_data.Rd +++ b/man/prepare_bbs_ts_data.Rd @@ -16,11 +16,14 @@ prepare_bbs_ts_data(start_yr = 1965, end_yr = 2017, min_num_yrs = 10, \item{path}{where to load the raw data files from} -\item{selected_set}{optional, a subset of the BBS communities to use (to speed up development). As c(1:X)} +\item{selected_set}{optional, a subset of the BBS communities to use +(to speed up development). As c(1:X)} } \description{ Modified from https://github.com/weecology/bbs-forecasting -and https://github.com/weecology/MATSS-community-change -Selects sites with data spanning start_yr through end_yr containing at least min_num_yrs of data -samples during that period. Cleans data tables and stores each individual route as a .Rds file. Saves a data table of the route + region pairs. + and https://github.com/weecology/MATSS-community-change + Selects sites with data spanning start_yr through end_yr containing at + least min_num_yrs of data samples during that period. Cleans data tables + and stores each individual route as a .Rds file. Saves a data table of the + route + region pairs. } diff --git a/man/process_bbs_route_region_data.Rd b/man/process_bbs_route_region_data.Rd index e658ec1..a8bd920 100644 --- a/man/process_bbs_route_region_data.Rd +++ b/man/process_bbs_route_region_data.Rd @@ -4,20 +4,15 @@ \alias{process_bbs_route_region_data} \title{Process the BBS data for an individual route and region} \usage{ -process_bbs_route_region_data(bbs_data_table, species_table, - path = get_default_data_path()) +process_bbs_route_region_data(bbs_data_table, species_table) } \arguments{ \item{bbs_data_table}{main bbs data table} \item{species_table}{table of species for BBS} - -\item{path}{path} - -\item{route_region}{named list of route and region to subset to} } \value{ -nothing +the processed BBS data } \description{ Correct and otherwise filter BBS species data (see From 9f996c8e8b00dc2d4e265146a40abebcc4835368 Mon Sep 17 00:00:00 2001 From: Hao Ye Date: Tue, 28 May 2019 11:42:25 -0400 Subject: [PATCH 29/35] make function arguments consistent pass args properly for build_bbs_datasets_plan --- NAMESPACE | 4 +-- R/bbs_cleaning_functions.R | 18 +++++----- R/build_plans.R | 34 ++++++++----------- R/get_retriever_data.R | 4 +-- man/build_bbs_datasets_plan.Rd | 8 +++-- man/build_datasets_plan.Rd | 7 ++-- ...ubspecies.Rd => combine_bbs_subspecies.Rd} | 6 ++-- man/{filter_ts.Rd => filter_bbs_ts.Rd} | 6 ++-- man/prepare_bbs_ts_data.Rd | 4 +-- process_bbs.R | 24 +++++++++++++ 10 files changed, 69 insertions(+), 46 deletions(-) rename man/{combine_subspecies.Rd => combine_bbs_subspecies.Rd} (72%) rename man/{filter_ts.Rd => filter_bbs_ts.Rd} (86%) create mode 100644 process_bbs.R diff --git a/NAMESPACE b/NAMESPACE index 05fbcff..b0e6213 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -8,9 +8,9 @@ export(build_datasets_plan) export(check_data_format) export(check_default_data_path) export(collect_analyses) -export(combine_subspecies) +export(combine_bbs_subspecies) export(filter_bbs_species) -export(filter_ts) +export(filter_bbs_ts) export(get_bbs_route_region_data) export(get_cowley_lizards) export(get_cowley_snakes) diff --git a/R/bbs_cleaning_functions.R b/R/bbs_cleaning_functions.R index 41bf1ac..42b2e4d 100644 --- a/R/bbs_cleaning_functions.R +++ b/R/bbs_cleaning_functions.R @@ -8,14 +8,14 @@ #' @param start_yr num first year of time-series #' @param end_yr num last year of time-series #' @param min_num_yrs num minimum number of years of data between start_yr & end_yr -#' @param selected_set optional, a subset of the BBS communities to use +#' @param bbs_subset optional, a subset of the BBS communities to use #' (to speed up development). As c(1:X) #' @inheritParams get_mtquad_data #' @return NULL #' @export prepare_bbs_ts_data <- function(start_yr = 1965, end_yr = 2017, min_num_yrs = 10, - path = get_default_data_path(), selected_set = NULL) + path = get_default_data_path(), bbs_subset = NULL) { bbs_data_tables <- import_retriever_data("breed-bird-survey", path = path) @@ -34,7 +34,7 @@ prepare_bbs_ts_data <- function(start_yr = 1965, end_yr = 2017, min_num_yrs = 10 long = longitude, species_id = aou, abundance = speciestotal) %>% - MATSS::filter_ts(start_yr, end_yr, min_num_yrs) + filter_bbs_ts(start_yr, end_yr, min_num_yrs) # prepare and write out route and region metadata bbs_routes_regions <- bbs_data %>% @@ -50,8 +50,8 @@ prepare_bbs_ts_data <- function(start_yr = 1965, end_yr = 2017, min_num_yrs = 10 write.csv(bbs_routes_regions, file.path(storage_path, "routes_and_regions_table.csv"), row.names = F) # filter and process selected route and region combinations - if (!is.null(selected_set)) { - bbs_routes_regions <- bbs_routes_regions[selected_set, ] + if (!is.null(bbs_subset)) { + bbs_routes_regions <- bbs_routes_regions[bbs_subset, ] } bbs_routes_regions %>% @@ -84,7 +84,7 @@ process_bbs_route_region_data <- function(bbs_data_table, species_table) # process species IDs this_bbs_data <- bbs_data_table %>% - combine_subspecies(species_table = species_table) %>% + combine_bbs_subspecies(species_table = species_table) %>% filter_bbs_species(species_table = species_table) %>% dplyr::mutate(species_id = paste('sp', species_id, sep=''), date = as.Date(paste(year, month, day, sep = "-"))) %>% @@ -125,7 +125,7 @@ process_bbs_route_region_data <- function(bbs_data_table, species_table) #' #' @return dataframe with original data and associated environmental data #' @export -filter_ts <- function(bbs_data, start_yr, end_yr, min_num_yrs) { +filter_bbs_ts <- function(bbs_data, start_yr, end_yr, min_num_yrs) { sites_to_keep = bbs_data %>% dplyr::filter(year >= start_yr, year <= end_yr) %>% dplyr::group_by(site_id) %>% @@ -158,7 +158,7 @@ filter_bbs_species <- function(df, species_table){ is_unidentified = function(names) { #Before filtering, account for this one hybrid of 2 subspecies so it's kept - names[names=='auratus auratus x auratus cafer']='auratus auratus' + names[names == 'auratus auratus x auratus cafer'] = 'auratus auratus' grepl('sp\\.| x |\\/', names) } @@ -178,7 +178,7 @@ filter_bbs_species <- function(df, species_table){ #' Modified from https://github.com/weecology/bbs-forecasting/blob/master/R/forecast-bbs-core.R #' #' @export -combine_subspecies = function(df, species_table){ +combine_bbs_subspecies = function(df, species_table){ # Subspecies have two spaces separated by non-spaces subspecies_names = species_table %>% diff --git a/R/build_plans.R b/R/build_plans.R index c10eb99..e4f6b4a 100644 --- a/R/build_plans.R +++ b/R/build_plans.R @@ -63,9 +63,9 @@ build_analyses_plan <- function(methods, datasets, ...) #' @title Generate a Drake Plan for Datasets #' #' @param data_path where to get the downloaded retriever datasets -#' @param include_downloaded_data whether to also include downloadable datasets +#' @param include_retriever_data whether to include retriever-downloaded data #' @param include_bbs_data whether to include BBS data -#' @param bbs_subset optional, a subset of the BBS communities to use (to speed up development). As c(1:X) +#' @inheritParams build_bbs_datasets_plan #' #' @return a drake plan (i.e. a tibble) specifying the targets and commands #' for gathering datasets @@ -73,7 +73,7 @@ build_analyses_plan <- function(methods, datasets, ...) #' @export #' build_datasets_plan <- function(data_path = get_default_data_path(), - include_downloaded_data = FALSE, + include_retriever_data = FALSE, include_bbs_data = FALSE, bbs_subset = NULL) { @@ -86,7 +86,8 @@ build_datasets_plan <- function(data_path = get_default_data_path(), karoo_data = get_karoo_data(), kruger_data = get_kruger_data() ) - if (include_downloaded_data) + + if (include_retriever_data) { datasets <- datasets %>% dplyr::bind_rows( @@ -99,11 +100,7 @@ build_datasets_plan <- function(data_path = get_default_data_path(), } if (include_bbs_data) { - bbs_datasets = build_bbs_datasets_plan(data_path = data_path) - - if(!is.null(bbs_subset)) { - bbs_datasets = bbs_datasets[bbs_subset, ] - } + bbs_datasets = build_bbs_datasets_plan(data_path = data_path, bbs_subset = bbs_subset) datasets <- datasets %>% dplyr::bind_rows(bbs_datasets) @@ -114,25 +111,24 @@ build_datasets_plan <- function(data_path = get_default_data_path(), #' @title Generate a Drake Plan for BBS Datasets #' -#' @param path path -#' @param from_raw whether to re-prep BBS data +#' @inheritParams build_datasets_plan +#' @inheritParams prepare_bbs_ts_data #' #' @return a drake plan (i.e. a tibble) specifying the targets and commands #' for gathering BBS datasets #' #' @export #' -build_bbs_datasets_plan <- function(data_path = get_default_data_path()) +build_bbs_datasets_plan <- function(data_path = get_default_data_path(), bbs_subset = NULL) { - if(!file.exists(file.path(data_path, "breed-bird-survey-prepped", "routes_and_regions_table.csv"))) { - prepare_bbs_ts_data() + routes_and_regions_file <- file.path(data_path, "breed-bird-survey-prepped", "routes_and_regions_table.csv") + + if (!file.exists(routes_and_regions_file)) { + prepare_bbs_ts_data(path = data_path, bbs_subset = bbs_subset) } - routes_and_regions = read.csv(file.path(data_path, "breed-bird-survey-prepped", "routes_and_regions_table.csv"), stringsAsFactors = F) - - routes_and_regions = routes_and_regions %>% - dplyr::mutate(bcr = as.character(bcr), route = as.character(route)) - + routes_and_regions <- read.csv(routes_and_regions_file, colClasses = "character") + bbs_datasets <- drake::drake_plan( bbs_data_rtrg = target(get_bbs_route_region_data(route, region, path = !!data_path), transform = map(route = !!rlang::syms(routes_and_regions$route), diff --git a/R/get_retriever_data.R b/R/get_retriever_data.R index 1030e0a..9f57111 100644 --- a/R/get_retriever_data.R +++ b/R/get_retriever_data.R @@ -7,8 +7,8 @@ #' @export get_bbs_route_region_data = function(route, region, path = get_default_data_path()) { this_path = file.path(path, "breed-bird-survey-prepped", paste0("route", route, "region", region, ".Rds")) - if(file.exists(this_path)) { - return(readRDS(this_path)) + if (file.exists(this_path)) { + return(readRDS(this_path)) } else { return(NULL) } diff --git a/man/build_bbs_datasets_plan.Rd b/man/build_bbs_datasets_plan.Rd index 1a34b33..64b0d4d 100644 --- a/man/build_bbs_datasets_plan.Rd +++ b/man/build_bbs_datasets_plan.Rd @@ -4,12 +4,14 @@ \alias{build_bbs_datasets_plan} \title{Generate a Drake Plan for BBS Datasets} \usage{ -build_bbs_datasets_plan(data_path = get_default_data_path()) +build_bbs_datasets_plan(data_path = get_default_data_path(), + bbs_subset = NULL) } \arguments{ -\item{path}{path} +\item{data_path}{where to get the downloaded retriever datasets} -\item{from_raw}{whether to re-prep BBS data} +\item{bbs_subset}{optional, a subset of the BBS communities to use +(to speed up development). As c(1:X)} } \value{ a drake plan (i.e. a tibble) specifying the targets and commands diff --git a/man/build_datasets_plan.Rd b/man/build_datasets_plan.Rd index ce7db31..f3db63f 100644 --- a/man/build_datasets_plan.Rd +++ b/man/build_datasets_plan.Rd @@ -5,17 +5,18 @@ \title{Generate a Drake Plan for Datasets} \usage{ build_datasets_plan(data_path = get_default_data_path(), - include_downloaded_data = FALSE, include_bbs_data = FALSE, + include_retriever_data = FALSE, include_bbs_data = FALSE, bbs_subset = NULL) } \arguments{ \item{data_path}{where to get the downloaded retriever datasets} -\item{include_downloaded_data}{whether to also include downloadable datasets} +\item{include_retriever_data}{whether to include retriever-downloaded data} \item{include_bbs_data}{whether to include BBS data} -\item{bbs_subset}{optional, a subset of the BBS communities to use (to speed up development). As c(1:X)} +\item{bbs_subset}{optional, a subset of the BBS communities to use +(to speed up development). As c(1:X)} } \value{ a drake plan (i.e. a tibble) specifying the targets and commands diff --git a/man/combine_subspecies.Rd b/man/combine_bbs_subspecies.Rd similarity index 72% rename from man/combine_subspecies.Rd rename to man/combine_bbs_subspecies.Rd index a17287c..895acf3 100644 --- a/man/combine_subspecies.Rd +++ b/man/combine_bbs_subspecies.Rd @@ -1,10 +1,10 @@ % Generated by roxygen2: do not edit by hand % Please edit documentation in R/bbs_cleaning_functions.R -\name{combine_subspecies} -\alias{combine_subspecies} +\name{combine_bbs_subspecies} +\alias{combine_bbs_subspecies} \title{Combine subspecies into their common species} \usage{ -combine_subspecies(df, species_table) +combine_bbs_subspecies(df, species_table) } \description{ Modified from https://github.com/weecology/bbs-forecasting/blob/master/R/forecast-bbs-core.R diff --git a/man/filter_ts.Rd b/man/filter_bbs_ts.Rd similarity index 86% rename from man/filter_ts.Rd rename to man/filter_bbs_ts.Rd index 0fb3756..ea08f54 100644 --- a/man/filter_ts.Rd +++ b/man/filter_bbs_ts.Rd @@ -1,10 +1,10 @@ % Generated by roxygen2: do not edit by hand % Please edit documentation in R/bbs_cleaning_functions.R -\name{filter_ts} -\alias{filter_ts} +\name{filter_bbs_ts} +\alias{filter_bbs_ts} \title{Filter BBS to specified time series period and number of samples} \usage{ -filter_ts(bbs_data, start_yr, end_yr, min_num_yrs) +filter_bbs_ts(bbs_data, start_yr, end_yr, min_num_yrs) } \arguments{ \item{bbs_data}{dataframe that contains BBS site_id and year columns} diff --git a/man/prepare_bbs_ts_data.Rd b/man/prepare_bbs_ts_data.Rd index ccaa9a7..c008885 100644 --- a/man/prepare_bbs_ts_data.Rd +++ b/man/prepare_bbs_ts_data.Rd @@ -5,7 +5,7 @@ \title{Prepare BBS population time-series data} \usage{ prepare_bbs_ts_data(start_yr = 1965, end_yr = 2017, min_num_yrs = 10, - path = get_default_data_path(), selected_set = NULL) + path = get_default_data_path(), bbs_subset = NULL) } \arguments{ \item{start_yr}{num first year of time-series} @@ -16,7 +16,7 @@ prepare_bbs_ts_data(start_yr = 1965, end_yr = 2017, min_num_yrs = 10, \item{path}{where to load the raw data files from} -\item{selected_set}{optional, a subset of the BBS communities to use +\item{bbs_subset}{optional, a subset of the BBS communities to use (to speed up development). As c(1:X)} } \description{ diff --git a/process_bbs.R b/process_bbs.R new file mode 100644 index 0000000..05facf4 --- /dev/null +++ b/process_bbs.R @@ -0,0 +1,24 @@ +library(dplyr) +library(readr) +dat <- read_csv("~/data/breed-bird-survey/breed_bird_survey_region_codes.csv") +dat %>% + filter(countrynum == 124, regioncode == 4) %>% + write_csv("inst/extdata/subsampled/breed-bird-survey/breed_bird_survey_region_codes.csv") + +dat <- read_csv("~/data/breed-bird-survey/breed_bird_survey_counts.csv") +dat %>% + filter(countrynum == 124, statenum == 4) %>% + head(n = 100) %>% + write_csv("inst/extdata/subsampled/breed-bird-survey/breed_bird_survey_counts.csv") + +dat <- read_csv("~/data/breed-bird-survey/breed_bird_survey_weather.csv") +dat %>% + filter(countrynum == 124, statenum == 4) %>% + head(n = 100) %>% + write_csv("inst/extdata/subsampled/breed-bird-survey/breed_bird_survey_weather.csv") + +dat <- read_csv("~/data/breed-bird-survey/breed_bird_survey_species.csv") +dat %>% + filter(countrynum == 124, statenum == 4) %>% + head(n = 100) %>% + write_csv("inst/extdata/subsampled/breed-bird-survey/breed_bird_survey_weather.csv") From e773af71bbc2c605411b336b5bfeeec17e569f78 Mon Sep 17 00:00:00 2001 From: Hao Ye Date: Tue, 28 May 2019 12:28:43 -0400 Subject: [PATCH 30/35] fix bbs-data-test --- .../breed_bird_survey_routes.csv | 202 +++++++++--------- tests/testthat/test-04-retriever-data.R | 32 +-- 2 files changed, 119 insertions(+), 115 deletions(-) diff --git a/inst/extdata/subsampled/breed-bird-survey/breed_bird_survey_routes.csv b/inst/extdata/subsampled/breed-bird-survey/breed_bird_survey_routes.csv index b1584fd..5e92b54 100644 --- a/inst/extdata/subsampled/breed-bird-survey/breed_bird_survey_routes.csv +++ b/inst/extdata/subsampled/breed-bird-survey/breed_bird_survey_routes.csv @@ -1,101 +1,101 @@ -countrynum,statenum,route,routename,active,latitude,longitude,stratum,bcr,routetypeid,routetypedetailid -840,2,1,ST FLORIAN,1,34.868688,-87.6041417,14,27,1,1 -840,2,2,HILLSBORO,0,34.6386747,-87.1912919,14,24,1,1 -840,2,3,FLORENCE,0,34.8,-87.7333333,14,24,1,1 -840,2,4,TRADE,1,34.0297881,-87.0592352,13,28,1,1 -840,2,5,SUMMITT,0,34.2016687,-86.4934089,13,28,1,1 -840,2,6,VALHERMOSO SPGS,0,34.5012877,-86.6855493,14,24,1,1 -840,2,7,SWAIM,1,34.8680404,-86.2030371,14,24,1,1 -840,2,8,PINE GROVE,1,34.0278089,-85.7110414,13,28,1,1 -840,2,9,DAWSON,0,34.3039507,-85.9267589,13,28,1,1 -840,2,10,MILLERVILLE,1,33.1913463,-85.9258408,11,29,1,1 -840,2,11,DEARMANVILLE,0,33.6257237,-85.7518379,13,28,1,1 -840,2,12,SUNNY EVE,1,33.6076572,-85.7511714,13,28,1,1 -840,2,13,GREENSPORT,1,33.8116977,-86.1153789,13,28,1,1 -840,2,14,SMYER LAKE,1,33.4549551,-86.6010915,13,28,1,1 -840,2,15,MT OLIVE,1,33.6822947,-86.8721632,13,28,1,1 -840,2,16,HOWARD,1,33.8481773,-87.5888357,13,27,1,1 -840,2,17,MAYTOWN,1,33.5263185,-87.0044623,13,28,1,1 -840,2,18,MARVEL,0,33.15,-87.0,4,28,1,1 -840,2,19,LIBERTY,1,33.4765537,-88.1712189,4,27,1,1 -840,2,20,RIDERWOOD,1,32.1307226,-88.3172665,4,27,1,1 -840,2,21,LINDEN,1,32.2782397,-87.8359539,4,27,1,1 -840,2,22,HARRELL,1,32.442715,-87.2158334,4,27,1,1 -840,2,23,GREENSBORO,1,32.7846996,-87.5153953,4,27,1,1 -840,2,24,SPRAGUE,1,32.1312407,-86.2754989,4,27,1,1 -840,2,25,BILLINGSLEY,1,32.6594297,-86.7017714,4,27,1,1 -840,2,26,WALLSBORO,1,32.5890245,-86.1307777,4,27,1,1 -840,2,27,WARRIOR STD,1,32.3116131,-85.5530853,4,27,1,1 -840,2,28,LANETT,1,32.8854647,-85.2044589,11,29,1,1 -840,2,29,COTTONTON,1,32.1473077,-85.0626449,4,27,1,1 -840,2,30,NEWTON,1,31.3388298,-85.5895835,4,27,1,1 -840,2,31,GRANGEBURG,1,31.0081277,-85.2112631,4,27,1,1 -840,2,32,BRUNDIDGE,1,31.7165541,-85.8156189,4,27,1,1 -840,2,33,BRANTLEY,1,31.5859083,-86.250378,4,27,1,1 -840,2,34,SOUTH,1,31.4439507,-86.6131969,4,27,1,1 -840,2,35,MCLELLAN,1,30.9977072,-86.8858316,4,27,1,1 -840,2,36,BEATRICE,1,31.7399574,-87.2090516,4,27,1,1 -840,2,37,LATHAM,0,31.0969767,-87.8321999,4,27,1,1 -840,2,38,CASTLEBERRY,1,31.3180673,-87.1203132,4,27,1,1 -840,2,39,MILLRY,1,31.632605,-88.3131441,4,27,1,1 -840,2,40,DAUPHIN IS,0,30.2540327,-88.1125479,3,27,1,1 -840,2,41,ALABAMA PT,0,30.2818577,-87.5183809,3,27,1,1 -840,2,42,FOLEY,0,30.3701137,-87.6833489,3,27,1,1 -840,2,43,BLOCTON,1,33.1156047,-87.1007539,13,27,1,1 -840,2,44,BIRMINGHAM,0,33.5909437,-86.6965489,13,28,1,1 -840,2,45,WHITEHOUSE,1,34.1311637,-87.7621469,4,27,1,1 -840,2,46,GUNTERSVILLE,1,34.3142387,-86.4773569,13,28,1,1 -840,2,47,JENA,1,33.1379607,-87.8205274,4,27,1,1 -840,2,48,EPES,1,32.6807827,-88.1229309,4,27,1,1 -840,2,49,WEDGEWORTH,1,32.8055085,-87.7643955,4,27,1,1 -840,2,50,WHITEHALL,1,32.3276808,-86.7118894,4,27,1,1 -840,2,51,LIBERTY CITY,0,32.5816871,-85.7164607,11,29,1,1 -840,2,52,ESCATAWPA,1,31.2926075,-88.38516,4,27,1,1 -840,2,53,GROVE HILL,1,31.7097587,-87.7767179,4,27,1,1 -840,2,54,FAIRVIEW,1,31.2223969,-86.0994295,4,27,1,1 -840,2,55,ELAMVILLE,1,31.6676037,-85.6508719,4,27,1,1 -840,2,56,CHILDERSBURG,0,33.4572917,-86.2574629,13,28,1,1 -840,2,57,YOUNGTOWN,1,34.4236313,-87.3907904,13,28,1,1 -840,2,58,MENTONE,1,34.5810567,-85.565583,13,28,1,1 -840,2,59,CARROLLTON,1,33.2811827,-88.0092154,4,27,1,1 -840,2,60,HOLT,1,33.2638251,-87.4241383,4,27,1,1 -840,2,61,ODENVILLE,1,33.718519,-86.4457647,13,28,1,1 -840,2,62,BORDEN SPRNG,0,33.9282957,-85.4680639,11,28,1,1 -840,2,63,ROCK CHAPEL,1,32.4128107,-87.5381089,4,27,1,1 -840,2,64,NIXBURG,0,32.8224147,-86.1118009,11,29,1,1 -840,2,65,CALEBEE,1,32.4341515,-85.8711729,4,27,1,1 -840,2,66,APPLETON,1,31.2283931,-87.0654001,4,27,1,1 -840,2,67,MT. GILEAD,1,31.4086552,-86.270046,4,27,1,1 -840,2,68,MADRID,1,31.0322875,-85.4115544,4,27,1,1 -840,2,69,GEORGETOWN,1,30.9422777,-88.3523559,4,27,1,1 -840,2,70,BON SECOUR,1,30.3038647,-87.7299991,3,27,1,1 -840,2,71,WHEELER DAM,1,34.7961251,-87.3837235,14,24,1,1 -840,2,72,ELKMONT,1,34.9292307,-86.9887629,14,24,1,1 -840,2,73,WOODVILLE,1,34.9895137,-86.0671689,21,28,1,1 -840,2,102,COURTLAND,1,34.6030578,-87.2543912,14,24,1,1 -840,2,105,BROOKSVILLE,1,34.2126918,-86.4734413,13,28,1,1 -840,2,106,VALHERMOSO SPG 2,0,34.5012877,-86.6855493,14,24,1,1 -840,2,109,LAKEVIEW,1,34.3086241,-85.9323092,13,28,1,1 -840,2,111,CHOCCOLOCCO,1,33.6296357,-85.7466579,13,28,1,1 -840,2,137,LATHAM 2,1,31.0706664,-87.8350582,4,27,1,1 -840,2,140,DAUPHIN IS 2,1,30.248466,-88.1123348,3,27,1,1 -840,2,141,ALABAMA PT 2,1,30.2816323,-87.5183917,3,27,1,1 -840,2,142,ELBERTA,1,30.370222,-87.6024375,3,27,1,1 -840,2,151,Liberty City 2,1,32.580056,-85.692643,11,29,1,1 -840,2,156,KYMULGA,1,33.2905307,-86.3312989,13,28,1,1 -840,2,162,Borden Springs 2,1,33.9413322,-85.450491,11,28,1,1 -840,2,164,NIXBURG 2,1,32.822371,-86.1117753,11,29,1,1 -840,2,201,VINA,1,34.2884067,-88.0675579,4,27,1,1 -840,2,203,CARTER GROVE,1,34.8223669,-86.6604516,14,24,1,1 -840,2,204,STEVENSON,1,34.7575557,-85.8594579,13,28,1,1 -840,2,205,VERNON,1,33.6853138,-88.1671198,4,27,1,1 -840,2,206,JASPER,0,33.8168747,-87.1378259,13,28,1,1 -840,2,207,ONEONTA,1,33.8564625,-86.3813006,13,28,1,1 -840,2,208,TALLADEGA,1,33.3180161,-86.1573541,13,28,1,1 -840,2,209,WEDOWEE,1,33.1844368,-85.464604,11,29,1,1 -840,2,210,GASTONBURG,1,32.1930088,-87.3792753,4,27,1,1 -840,2,211,AUTAUGAVILLE,1,32.4860839,-86.5697685,4,27,1,1 -840,2,212,SEALE,1,32.5033347,-85.2532189,4,27,1,1 -840,2,213,CITRONELLE,1,31.1365731,-88.2207774,4,27,1,1 -840,2,214,CLAIBORNE,1,31.7459607,-87.6361759,4,27,1,1 -840,2,215,HELICON,1,31.9052647,-86.1853409,4,27,1,1 +countrynum,statenum,route,routename,active,latitude,longitude,stratum,bcr,routetypeid,routetypedetailid +124,4,1,SEVEN PERSON,0,49.93222,-110.84452,38,11,1,1 +124,4,2,BOW ISLAND,1,49.87324,-111.4102,38,11,1,1 +124,4,3,MILK RIVER,1,49.08995,-112.39699,65,11,1,1 +124,4,4,FORT MACLEOD,1,49.81509,-113.56982000000001,38,11,1,1 +124,4,5,SENTINEL,0,49.6325,-114.58692,64,10,1,1 +124,4,6,BINDLOSS,1,50.74668,-110.25869,38,11,1,1 +124,4,7,BROOKS,0,50.56388,-111.84916,38,11,1,1 +124,4,8,BOW CITY,0,50.30279,-112.02041,38,11,1,1 +124,4,9,BUFFALO HILL,1,50.60147,-113.02852,38,11,1,1 +124,4,10,HIGHWOOD RIVER,1,50.48053,-114.42456,30,10,1,1 +124,4,11,CEREAL,1,51.00887,-110.7956,37,11,1,1 +124,4,12,BIG STONE,0,51.32875,-111.07823,37,11,1,1 +124,4,13,ROWLEY,1,51.77818,-112.64694,37,11,1,1 +124,4,14,KEOMA,0,51.21261,-113.77234,30,11,1,1 +124,4,15,EAGLE HILL,1,51.83143,-114.45039,30,6,1,1 +124,4,16,EXSHAW,0,51.09521,-115.09111,64,10,1,1 +124,4,17,BOW PASS,1,51.46021,-116.22023,64,10,1,1 +124,4,18,CZAR,1,52.46309,-110.65127,30,11,1,1 +124,4,19,TALBOT,1,52.20111,-111.07638,37,11,1,1 +124,4,20,HALKIRK,1,52.17208,-112.33861,37,11,1,1 +124,4,21,DELBURNE,0,52.20126,-113.22753,30,11,1,1 +124,4,22,RAVEN,1,52.02799,-114.47782,30,6,1,1 +124,4,23,HARLECH,0,52.49814,-116.00016,29,6,1,1 +124,4,24,WINDY POINT,1,52.25872,-116.39168,29,10,1,1 +124,4,25,MALIGNE LAKE,1,52.73141,-117.63709,64,10,1,1 +124,4,26,DERWENT,1,53.49666,-110.86644,30,11,1,1 +124,4,27,TWO HILLS,1,53.71555,-111.52556,30,11,1,1 +124,4,28,LINDBROOK,1,53.33769,-112.78208,30,11,1,1 +124,4,29,CALAHOO,1,53.68701,-113.88548,30,11,1,1 +124,4,30,WARBURG,0,53.16381,-114.22008,30,6,1,1 +124,4,31,RONAN,1,53.80272,-115.26551,29,6,1,1 +124,4,32,EDSON,1,53.59917,-116.40425,29,6,1,1 +124,4,33,ENTRANCE,1,53.3741,-117.71063,29,6,1,1 +124,4,34,HOFF,1,53.81254,-118.48345,29,10,1,1 +124,4,36,KEHIWIN LAKE,1,54.0577,-110.8863,30,6,1,1 +124,4,37,THERIEN,1,54.26763,-111.2782,30,6,1,1 +124,4,38,KINIKINIK,1,54.49999,-112.97986,29,6,1,1 +124,4,39,ATHABASCA,1,54.83513,-113.15816,29,6,1,1 +124,4,40,THUNDER LAKE,1,54.12038,-114.71491,29,6,1,1 +124,4,41,SWAN HILLS,0,54.76026,-115.53764,29,6,1,1 +124,4,42,WINDFALL,1,54.13311,-116.21592,30,6,1,1 +124,4,43,LITTLE SMOKY,1,54.76609,-117.24782,30,6,1,1 +124,4,44,ECONOMY CRK,1,54.75011,-118.22621,30,6,1,1 +124,4,45,WAPITI,0,54.93788,-119.19583,30,6,1,1 +124,4,46,WINEFRED LAKE,1,55.55421,-110.90708,29,6,1,1 +124,4,47,HEART LAKE,1,55.00613,-111.73195,29,6,1,1 +124,4,48,WANDERING R,0,55.38705,-112.45371,29,6,1,1 +124,4,49,CALLING LAKE,1,55.486,-113.44,29,6,1,1 +124,4,50,MARTEN RIVER,1,55.49903,-114.91416,29,6,1,1 +124,4,51,KINUSO,0,55.25797,-115.38534,29,6,1,1 +124,4,52,HIGH PRAIRIE,0,55.5528,-116.78184,29,6,1,1 +124,4,53,WATINO,1,55.78143,-117.82555,29,6,1,1 +124,4,54,RYCROFT,1,55.84027,-118.45722,29,6,1,1 +124,4,55,WEMBLEY,1,55.1415,-119.21774,30,6,1,1 +124,4,57,HANGINGSTONE,0,56.23349,-111.67212,29,6,1,1 +124,4,60,SUNNYBROOK,1,53.16381,-114.22008,30,6,1,1 +124,4,61,LOON RIVER,1,56.28424,-115.36416,29,6,1,1 +124,4,62,THREE CREEKS,1,56.3628,-117.00335,29,6,1,1 +124,4,63,CARDINAL LK,1,56.27611,-117.82119,29,6,1,1 +124,4,64,HINES CREEK,1,56.50842,-118.73912,29,6,1,1 +124,4,65,BEAR CANYON,1,56.19496,-119.8199,29,6,1,1 +124,4,73,HOTCHKISS,1,57.06812,-117.61089,29,6,1,1 +124,4,77,FORT SMITH,1,59.98857,-111.83849,25,6,1,1 +124,4,78,PEACE POINT,1,59.31102,-112.48716,29,6,1,1 +124,4,79,HAY CAMP,1,59.86175,-111.61484,25,6,1,1 +124,4,81,RED ROCK COULEE,1,49.8778677,-110.889404,38,11,1,1 +124,4,96,KANANASKIS,1,50.98545,-115.07526,64,10,1,1 +124,4,101,MANYBERRIES,1,49.26127,-110.69079,38,11,1,1 +124,4,102,SHERBOURNE L,1,49.58229,-111.69789,38,11,1,1 +124,4,103,HORSEFLY LK.,1,49.61134,-112.1495,38,11,1,1 +124,4,104,GRANUM,1,49.90214,-113.09867,38,11,1,1 +124,4,105,WATERTON PRK,1,49.0201,-114.04528,65,10,1,1 +124,4,106,SCHULER,1,50.00432,-110.07319,38,11,1,1 +124,4,107,WARDLOW,1,50.92139,-111.11275,38,11,1,1 +124,4,108,RANIER,0,50.30279,-112.02041,38,11,1,1 +124,4,109,MAZEPPA,1,50.42635,-113.82728,37,11,1,1 +124,4,110,OKOTOKS,0,50.54263,-114.09345,37,11,1,1 +124,4,111,ESTHER,1,51.44533,-110.38028,37,11,1,1 +124,4,112,HEMARUKA,1,51.57551,-111.20079,37,11,1,1 +124,4,113,DOWLING LAKE,1,51.95441,-112.13115,37,11,1,1 +124,4,114,SHEEP COULEE,1,51.56148,-113.89621,30,11,1,1 +124,4,115,DIDSBURY,1,51.54794,-114.21268,30,11,1,1 +124,4,116,WIGWAM CREEK,1,51.66166,-115.40694,29,6,1,1 +124,4,118,MILLARD LAKE,1,52.93074,-110.58437,30,11,1,1 +124,4,119,KILLAM,1,52.90149,-111.89042,30,11,1,1 +124,4,120,HEISLER,1,52.63801,-111.99628,30,11,1,1 +124,4,121,BATTLE RIVER,1,52.61069,-113.98702,30,11,1,1 +124,4,122,BENALTO,1,52.5814,-114.40959,30,6,1,1 +124,4,123,CRIPPLE CRK,1,52.20935,-115.96781,64,6,1,1 +124,4,125,SUNWAPTA FLS,1,52.48771,-117.51832,64,10,1,1 +124,4,126,VANESTI,1,53.29003,-110.54172,30,11,1,1 +124,4,127,VIKING,1,53.10329,-111.76012,30,11,1,1 +124,4,128,BRUCE,1,53.10505,-112.14825,30,11,1,1 +124,4,129,HAY LAKES,0,53.11978,-113.1229,30,11,1,1 +124,4,130,TOMAHAWK,0,53.54122,-114.78685,30,6,1,1 +124,4,131,MACKAY,1,53.77362,-115.61189,29,6,1,1 +124,4,136,BEAVERDAM,1,54.18052,-110.30494,29,6,1,1 +124,4,137,LAC LA BICHE,1,54.75735,-111.97184,29,6,1,1 +124,4,138,LONG LAKE,1,54.43414,-112.8288,30,6,1,1 +124,4,139,PICKARDVILLE,1,54.05083,-113.91555,30,11,1,1 diff --git a/tests/testthat/test-04-retriever-data.R b/tests/testthat/test-04-retriever-data.R index 92818e5..c40ba0c 100644 --- a/tests/testthat/test-04-retriever-data.R +++ b/tests/testthat/test-04-retriever-data.R @@ -1,18 +1,22 @@ context("Check Retriever datasets") -# -# test_that("get_bbs_data formats data correctly", { -# data_path <- system.file("extdata", "subsampled", -# package = "MATSS", mustWork = TRUE) -# Sys.setenv(MATSS_DATA_PATH = data_path) -# expect_error(dat <- get_bbs_data(region = 4, min_num_yrs = 1), NA) -# expect_true(check_data_format(dat)) -# expect_known_hash(dat$abundance, "0d083ef430") -# expect_known_hash(which(is.na(dat$covariates)), "40f5faaa59") -# dat$covariates[is.na(dat$covariates)] <- -999999 -# expect_known_hash(na.omit(dat$covariates), "6c2f809118") -# expect_known_hash(dat$metadata, "b5adce4593") -# expect_known_hash(dat, "72aa13aef2") -# }) + +test_that("process_bbs_ts_data formats data correctly", { + data_path <- system.file("extdata", "subsampled", + package = "MATSS", mustWork = TRUE) + Sys.setenv(MATSS_DATA_PATH = data_path) + expect_error(prepare_bbs_ts_data(), NA) + expect_error(dat <- get_bbs_route_region_data(route = 1, region = 11), NA) + expect_true(check_data_format(dat)) + expect_known_hash(dat$abundance, "3fe07b68b9") + expect_known_hash(dat$covariates, "3854304cf6") + expect_known_hash(dat$metadata, "f50efbadbf") + expect_known_hash(dat, "05adc99ddf") + + expect_error(dat <- get_bbs_route_region_data(route = 2, region = 11), NA) + expect_true(check_data_format(dat)) + expect_error(dat <- get_bbs_route_region_data(route = 3, region = 11), NA) + expect_true(check_data_format(dat)) +}) test_that("get_mtquad_data formats data correctly", { data_path <- system.file("extdata", "subsampled", From b962eb6dfd134fd5bfb57b4451b931988ed84d27 Mon Sep 17 00:00:00 2001 From: Hao Ye Date: Tue, 28 May 2019 12:51:38 -0400 Subject: [PATCH 31/35] fix plan test --- tests/testthat/test-05-build-plans.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/testthat/test-05-build-plans.R b/tests/testthat/test-05-build-plans.R index e6dd194..032fb5a 100644 --- a/tests/testthat/test-05-build-plans.R +++ b/tests/testthat/test-05-build-plans.R @@ -25,7 +25,7 @@ test_that("build_datasets_plan works", { expect_true(all(grepl("_data$", datasets$target))) expect_equal(dim(datasets), c(7, 2)) - expect_error(datasets <- build_datasets_plan(include_downloaded_data = TRUE), NA) + expect_error(datasets <- build_datasets_plan(include_retriever_data = TRUE), NA) expect_plan(datasets) expect_true(all(grepl("_data$", datasets$target))) expect_equal(dim(datasets), c(10, 2)) From 025927a071d92f37eea57c3823c9f84bfc7abc79 Mon Sep 17 00:00:00 2001 From: Hao Ye Date: Tue, 28 May 2019 13:52:48 -0400 Subject: [PATCH 32/35] include test for bbs dataset plan --- R/build_plans.R | 3 ++- tests/testthat/test-05-build-plans.R | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/R/build_plans.R b/R/build_plans.R index e4f6b4a..67e7391 100644 --- a/R/build_plans.R +++ b/R/build_plans.R @@ -100,7 +100,8 @@ build_datasets_plan <- function(data_path = get_default_data_path(), } if (include_bbs_data) { - bbs_datasets = build_bbs_datasets_plan(data_path = data_path, bbs_subset = bbs_subset) + bbs_datasets = build_bbs_datasets_plan(data_path = !!data_path, + bbs_subset = !!bbs_subset) datasets <- datasets %>% dplyr::bind_rows(bbs_datasets) diff --git a/tests/testthat/test-05-build-plans.R b/tests/testthat/test-05-build-plans.R index 032fb5a..5a08461 100644 --- a/tests/testthat/test-05-build-plans.R +++ b/tests/testthat/test-05-build-plans.R @@ -31,6 +31,23 @@ test_that("build_datasets_plan works", { expect_equal(dim(datasets), c(10, 2)) }) +test_that("build_bbs_datasets_plan works", { + data_path <- system.file("extdata", "subsampled", + package = "MATSS", mustWork = TRUE) + Sys.setenv(MATSS_DATA_PATH = data_path) + expect_error(datasets <- build_bbs_datasets_plan(), NA) + expect_plan(datasets) + expect_true(all(grepl("bbs_data_rtrg_[0-9]+_[0-9]+$", datasets$target))) + expect_equal(dim(datasets), c(3, 2)) + + expect_error(datasets <- build_datasets_plan(include_retriever_data = TRUE, + include_bbs_data = TRUE), NA) + expect_plan(datasets) + expect_equal(sum(grepl("_data$", datasets$target)), 10) + expect_equal(sum(grepl("bbs_data_rtrg_[0-9]+_[0-9]+$", datasets$target)), 3) + expect_equal(dim(datasets), c(13, 2)) +}) + test_that("build_analyses_plan works", { datasets <- build_datasets_plan() methods <- drake::drake_plan( From 319e93444fed77f67d6d1743b85700aac0853d34 Mon Sep 17 00:00:00 2001 From: Hao Ye Date: Tue, 28 May 2019 13:55:10 -0400 Subject: [PATCH 33/35] clean drake cache from vignettes folder and update .gitignore --- .gitignore | 2 +- vignettes/.drake/config/compress | 1 - vignettes/.drake/config/hash_algorithm | 1 - vignettes/.drake/config/mangle_key | 1 - vignettes/.drake/config/mangle_key_pad | 1 - vignettes/.drake/config/version | 1 - vignettes/.drake/data/052f671a04361c98.rds | Bin 464 -> 0 bytes vignettes/.drake/data/23fbbc5bddad2ce9.rds | Bin 56 -> 0 bytes vignettes/.drake/data/2c3d8028117512b7.rds | Bin 53 -> 0 bytes vignettes/.drake/data/2c697c6e11c14fba.rds | Bin 465 -> 0 bytes vignettes/.drake/data/3a8c46c97499a3c1.rds | Bin 52 -> 0 bytes vignettes/.drake/data/697685ec6b4d717c.rds | Bin 150 -> 0 bytes vignettes/.drake/data/6d6f4d10f2d3a386.rds | Bin 579 -> 0 bytes vignettes/.drake/data/7a71b3f7028b8f92.rds | Bin 120 -> 0 bytes vignettes/.drake/data/8271c9325d9ef093.rds | Bin 40 -> 0 bytes vignettes/.drake/data/8e42b9635a511761.rds | Bin 528 -> 0 bytes vignettes/.drake/data/9756935bcff80d2e.rds | Bin 29713 -> 0 bytes vignettes/.drake/data/9882e97b88564731.rds | Bin 40 -> 0 bytes vignettes/.drake/data/9971168f30739e70.rds | Bin 538 -> 0 bytes vignettes/.drake/data/997f44f13ddf401c.rds | Bin 50 -> 0 bytes vignettes/.drake/data/b87d23767f391c18.rds | Bin 285 -> 0 bytes vignettes/.drake/data/c28168faa0aa7ba1.rds | Bin 4191 -> 0 bytes vignettes/.drake/data/c40c00762a0dac94.rds | Bin 41 -> 0 bytes vignettes/.drake/data/c82520a724587517.rds | Bin 326 -> 0 bytes vignettes/.drake/data/cb0cc88d6109b9c8.rds | Bin 1081 -> 0 bytes vignettes/.drake/data/f4b89e63bc92af79.rds | Bin 1217 -> 0 bytes vignettes/.drake/keys/common/FALSE | 1 - vignettes/.drake/keys/common/TRUE | 1 - vignettes/.drake/keys/common/done | 1 - vignettes/.drake/keys/common/failed | 1 - vignettes/.drake/keys/common/running | 1 - vignettes/.drake/keys/memoize/1d62b406b8183a75 | 1 - vignettes/.drake/keys/memoize/2d6b88bf86616450 | 1 - vignettes/.drake/keys/memoize/5b70a6a1d10f6a37 | 1 - vignettes/.drake/keys/memoize/86e46293dac72466 | 1 - vignettes/.drake/keys/objects/data_1 | 1 - vignettes/.drake/keys/objects/data_2 | 1 - vignettes/.drake/keys/objects/my_model | 1 - vignettes/.drake/keys/objects/my_summary | 1 - vignettes/.drake/keys/progress/data_1 | 1 - vignettes/.drake/keys/progress/data_2 | 1 - vignettes/.drake/keys/progress/my_model | 1 - vignettes/.drake/keys/progress/my_summary | 1 - vignettes/.drake/keys/session/drake_version | 1 - vignettes/.drake/keys/session/seed | 1 - vignettes/.drake/keys/session/sessionInfo | 1 - 46 files changed, 1 insertion(+), 26 deletions(-) delete mode 100644 vignettes/.drake/config/compress delete mode 100644 vignettes/.drake/config/hash_algorithm delete mode 100644 vignettes/.drake/config/mangle_key delete mode 100644 vignettes/.drake/config/mangle_key_pad delete mode 100644 vignettes/.drake/config/version delete mode 100644 vignettes/.drake/data/052f671a04361c98.rds delete mode 100644 vignettes/.drake/data/23fbbc5bddad2ce9.rds delete mode 100644 vignettes/.drake/data/2c3d8028117512b7.rds delete mode 100644 vignettes/.drake/data/2c697c6e11c14fba.rds delete mode 100644 vignettes/.drake/data/3a8c46c97499a3c1.rds delete mode 100644 vignettes/.drake/data/697685ec6b4d717c.rds delete mode 100644 vignettes/.drake/data/6d6f4d10f2d3a386.rds delete mode 100644 vignettes/.drake/data/7a71b3f7028b8f92.rds delete mode 100644 vignettes/.drake/data/8271c9325d9ef093.rds delete mode 100644 vignettes/.drake/data/8e42b9635a511761.rds delete mode 100644 vignettes/.drake/data/9756935bcff80d2e.rds delete mode 100644 vignettes/.drake/data/9882e97b88564731.rds delete mode 100644 vignettes/.drake/data/9971168f30739e70.rds delete mode 100644 vignettes/.drake/data/997f44f13ddf401c.rds delete mode 100644 vignettes/.drake/data/b87d23767f391c18.rds delete mode 100644 vignettes/.drake/data/c28168faa0aa7ba1.rds delete mode 100644 vignettes/.drake/data/c40c00762a0dac94.rds delete mode 100644 vignettes/.drake/data/c82520a724587517.rds delete mode 100644 vignettes/.drake/data/cb0cc88d6109b9c8.rds delete mode 100644 vignettes/.drake/data/f4b89e63bc92af79.rds delete mode 100644 vignettes/.drake/keys/common/FALSE delete mode 100644 vignettes/.drake/keys/common/TRUE delete mode 100644 vignettes/.drake/keys/common/done delete mode 100644 vignettes/.drake/keys/common/failed delete mode 100644 vignettes/.drake/keys/common/running delete mode 100644 vignettes/.drake/keys/memoize/1d62b406b8183a75 delete mode 100644 vignettes/.drake/keys/memoize/2d6b88bf86616450 delete mode 100644 vignettes/.drake/keys/memoize/5b70a6a1d10f6a37 delete mode 100644 vignettes/.drake/keys/memoize/86e46293dac72466 delete mode 100644 vignettes/.drake/keys/objects/data_1 delete mode 100644 vignettes/.drake/keys/objects/data_2 delete mode 100644 vignettes/.drake/keys/objects/my_model delete mode 100644 vignettes/.drake/keys/objects/my_summary delete mode 100644 vignettes/.drake/keys/progress/data_1 delete mode 100644 vignettes/.drake/keys/progress/data_2 delete mode 100644 vignettes/.drake/keys/progress/my_model delete mode 100644 vignettes/.drake/keys/progress/my_summary delete mode 100644 vignettes/.drake/keys/session/drake_version delete mode 100644 vignettes/.drake/keys/session/seed delete mode 100644 vignettes/.drake/keys/session/sessionInfo diff --git a/.gitignore b/.gitignore index 0de4ca0..528d233 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,7 @@ .Rhistory .RData .Ruserdata -/.drake/ +.drake/ /output/drake-cache.sqlite /analysis/*.html /data/ diff --git a/vignettes/.drake/config/compress b/vignettes/.drake/config/compress deleted file mode 100644 index ef2f513..0000000 --- a/vignettes/.drake/config/compress +++ /dev/null @@ -1 +0,0 @@ -TRUE diff --git a/vignettes/.drake/config/hash_algorithm b/vignettes/.drake/config/hash_algorithm deleted file mode 100644 index 113c8a9..0000000 --- a/vignettes/.drake/config/hash_algorithm +++ /dev/null @@ -1 +0,0 @@ -xxhash64 diff --git a/vignettes/.drake/config/mangle_key b/vignettes/.drake/config/mangle_key deleted file mode 100644 index f6d449c..0000000 --- a/vignettes/.drake/config/mangle_key +++ /dev/null @@ -1 +0,0 @@ -FALSE diff --git a/vignettes/.drake/config/mangle_key_pad b/vignettes/.drake/config/mangle_key_pad deleted file mode 100644 index f6d449c..0000000 --- a/vignettes/.drake/config/mangle_key_pad +++ /dev/null @@ -1 +0,0 @@ -FALSE diff --git a/vignettes/.drake/config/version b/vignettes/.drake/config/version deleted file mode 100644 index 6085e94..0000000 --- a/vignettes/.drake/config/version +++ /dev/null @@ -1 +0,0 @@ -1.2.1 diff --git a/vignettes/.drake/data/052f671a04361c98.rds b/vignettes/.drake/data/052f671a04361c98.rds deleted file mode 100644 index 6a60ee0cf3851ae8698966365c0a2c747a3588f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 464 zcmV;>0Wba^iwFP!000001FcgrOT$1EzP3r)6lsh82S-5{!6iC4iO@~AculU!VR8w% zt5O`DodpNQNhux0QJh3@5&wmgh?9fWT#`$Z*ir`rFS+;Kd*6NU-pg(s08j=MxeUq` zzFY`j&Cpt*m4F1)@T-`RL49Q^T94595o>M@{@r-q**{w6TNUoh+UM%l!`0ilc7Hri zPEXp}=I|)!kVTR|rkeF#NkdIPN>S6~8Cc`5pX4oSl)UYA3#J1#mCYm5X!T~N; z4`%z(1xQl|rI9Ha2w!V=wqM?_!SDTC<&t1yFt8At++c|}SOkWxWyp<-`-?Em=RyW! zVS9ODvCzT)3d>P7MKmAwiL^EB`d+|N-l~f!#l#Yc6pe?Sws^fZ~zh3@r)uV9*) zlqw6bWu+<$6V{9;3=yNR+mPA<#>DS2JtEG)t?-aZ_*|qZ&m8OQ^rC+djD7%@-7agA G1ONd48QmQK diff --git a/vignettes/.drake/data/23fbbc5bddad2ce9.rds b/vignettes/.drake/data/23fbbc5bddad2ce9.rds deleted file mode 100644 index d1de240719c68df50591e4ee7c4e40ce1b8e8e25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56 zcmb2|=3oE==I#ec2?+^F32CWG2}x{5k}M4~CN{P<3VRgKd@1=-@>Qgi#0&<8t&;8u H8bA#I(ZCSy diff --git a/vignettes/.drake/data/2c3d8028117512b7.rds b/vignettes/.drake/data/2c3d8028117512b7.rds deleted file mode 100644 index d369f11f68a70a7b4bd5f7c62fd583c4a545743f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53 zcmb2|=3oE==I#ec2?+^F32CWG2}x{5k}M4~CN{P<3VUo8pZe@+>a(TH4D%OA2C4#8 F0|2N#5gz~m diff --git a/vignettes/.drake/data/2c697c6e11c14fba.rds b/vignettes/.drake/data/2c697c6e11c14fba.rds deleted file mode 100644 index 9160273ee98a0ffc9112d29642e24b4d5fea8eaf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 465 zcmV;?0WSU@iwFP!000001FcgrOT$1Iy|!uE6tM+22i+Wn4kEaO&LZgM7Ou%PImsm< zcU6mnT^s~AHy2ltjt(6}97LS`7vkjTQq5g*X%brM;KAkYz5DLF_uai5HUI!+P^p$d zxx%L_(We>pR@6&C0a`Sw7G%(9&t)5ejhmeFzRbtY%huWYkS|p@uIk^bw@=4!5BhWG za(nmnPM?eqJ}=hB`i-D>^wFr^-uM^*pp-MGRXs=$O(awkQtML`Zc^m-5~5BAG>dD< zg#krY0vjUUbg(NKjctneq6fzjhKMB?)PB+JT$UkE0@m%uK+ Hlmq|(B!k*G diff --git a/vignettes/.drake/data/3a8c46c97499a3c1.rds b/vignettes/.drake/data/3a8c46c97499a3c1.rds deleted file mode 100644 index 669295f3e0d74b11e97ab878d9a61b7e6cebfc16..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52 zcmb2|=3oE==I#ec2?+^F32CWG2}x{5k}M4~CN{P<3VUo`s+#s}$ub6pb5B=pQ~@dm E0G5amcmMzZ diff --git a/vignettes/.drake/data/697685ec6b4d717c.rds b/vignettes/.drake/data/697685ec6b4d717c.rds deleted file mode 100644 index e7182fc70c87d59dda02e07d477d89ed0858d21a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 150 zcmV;H0BQdpiwFP!000001B>8dU|?WkU}j}vU}6R`nT5f81_l8jW@TVu-~`ev1v!a% zP&QjiVo74WAqvk3uN--1apYFU=jNxR=0N#eKz?y)Zf;^xCD0I%3mKs@ta*vKsl`xh zm|)hV73Jqb*-Rz*Xj(Xn^2_y*wb9UZ$vKI|Fl%6fTp+{r(u#mC0P_9;04o}-(S-p3 E05CB?RsaA1 diff --git a/vignettes/.drake/data/6d6f4d10f2d3a386.rds b/vignettes/.drake/data/6d6f4d10f2d3a386.rds deleted file mode 100644 index 47d85effc81998af173bf29d1573c0e3a27df83c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 579 zcmV-J0=)eniwFP!000001MODNZ<{a_c7TwCE^XKLI*CiARN5ugPL;ZUVwc^J10Ju~Wr{_uq^Q$&S7+P0@r<3*0&`M>!}fZzoe!=;7<$FKyX%59oC$`D+)@VQ zS0%u)XStZNGR4fXF!|FfCk&0WUKG0YC$g(TL%_3vDg2$cc1EF{ivLg(Uhp zQc=~(W=omYT!BGSOLfO0qrZpUOTA_q%%q@sP6Rxjb{_4NPI_&h*S-;MAl{nIr-Hr! z!y$WDi?l7^&To211TarEGypqcvzKQe&yVo=kKi-syQEE*A?u)F9664NM>IZYd|n-# zJsGX5{*A#{uYh_0+%?qM2CL_U`T9BSs4t$bQ_ji_X7zBY5?+d(16iLKU#Udm$GDCC zbKH83@8jP2&D-eE$_qn|Kt6%_L$j~dQpu+leU21*?-Ys@h3c((M~5wwF8=k`>wV|X zGzt!nZkuQGT$I}?+3YNf*|&-YvVf;GQ-9D#%8|%LG zZemrWSm(Qf1aCU+D3w(k`#&J#nL|D|bRR*!Fo_6jm#}u_AnB2)?}(_Q*aPcpF-Ecd R9dwcU=`W`KiL@LH0006|9dQ5v diff --git a/vignettes/.drake/data/7a71b3f7028b8f92.rds b/vignettes/.drake/data/7a71b3f7028b8f92.rds deleted file mode 100644 index 59b489a476776b57800ebe6e933a4162401ac7b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 120 zcmb2|=3oE==I#ec2?+^F32CWG2}x{*t&J?oQ`k5;8h+~V%yF2tR6*U4-=q17Lj(6B zv6jdg6RvE0ruuA|n6s&|GwV$+q3%n;-V1EjO}Wza=*N;vXXc2k;BZgNbF2&W%;K8x Xmp@72alH)R4|axgAs=sS2U-XK^HVNm diff --git a/vignettes/.drake/data/8271c9325d9ef093.rds b/vignettes/.drake/data/8271c9325d9ef093.rds deleted file mode 100644 index d6f5340f674f3e85622b6cb72cba11c7e7f04e65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40 qcmb2|=3oE==I#ec2?+^F32CWG2}x{5k`6U)0&EPH*|$QZfC>P_zX_=T diff --git a/vignettes/.drake/data/8e42b9635a511761.rds b/vignettes/.drake/data/8e42b9635a511761.rds deleted file mode 100644 index a1d9ab2b7b7bddad0bab49e41265259dc1a4bdeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 528 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 c++<$-gw{06T~{W#R+?071zNssI20 diff --git a/vignettes/.drake/data/997f44f13ddf401c.rds b/vignettes/.drake/data/997f44f13ddf401c.rds deleted file mode 100644 index cff74d9e14b1f69405e14a6df18826f1a4375157..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50 zcmb2|=3oE==I#ec2?+^F32CWG2}x{5k}M4~CN{P<3VUo`^5pqaCWh75H$74UDg^*~ CUlBC` diff --git a/vignettes/.drake/data/b87d23767f391c18.rds b/vignettes/.drake/data/b87d23767f391c18.rds deleted file mode 100644 index 7348de6c71b080f706843489e4475b8794d02ed1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 285 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 diff --git a/vignettes/.drake/data/c40c00762a0dac94.rds b/vignettes/.drake/data/c40c00762a0dac94.rds deleted file mode 100644 index 93339bda9e5d7ce41bf3131794b3b375843ee6d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41 scmb2|=3oE==I#ec2?+^F32CWG2}x{5l0O<|Ol0I@Sh4*rlN?Y50OnH*y#N3J diff --git a/vignettes/.drake/data/c82520a724587517.rds b/vignettes/.drake/data/c82520a724587517.rds deleted file mode 100644 index 2868ee813815265ddfa47b2dc72b1a8bd104a0d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 326 zcmV-M0lEGkiwFP!000001B>8dU|?WkU}j}vU}6R`nT3G_E0E>|ae$Z+EDvV0FoF3j z44gokEhn`sHK!QJ5&+9WMT=8Q@{1FpJg&0TqTI=(US@J4nsKbj zIf=zE)8KZbB_@{u^)fL017bdqJq{vlDtGmz7C4CSD?72pGQvSBN@fj*p*mciJEz-u zY9pHio5t5e{V|#j?57Si3+2s#$=iQV0c&s&S#CA;T{29jt`UaWs0QdnIRASIhEptO% znFQHZnDP`z@FqM$r7~i~45=>=R8$oeCB3%Sw_BEbWyZPE&CdQgYp=b}x#t}J)J!R5 zsZz^QRw@3i>=%D(#k*6yFZ&0li>JT;YW}?L@BKD^-uCxoKS+zGe~91gyRtK$xc&Q! zC*-c=ZOM-E5DyRR=>Z7x4shJQYkY{?vwj2*=V^5u8vkR- zBjMbUghvlv;(bJ)71x6o^(+3i{9Wl?`YqX`57L>ZuG_(pPX5r1#~t~>?;3yVLPlO& zcj!H<8(xmnwK`%xZJi;h)7K$+z&Wh$@-e^>hVlK6d|J#{zmd4|+8-ClqZ*bwUqrM=)0T(_^^Mk)_c<5di_O@`^vg0Qn9P*as$%NzMsH1K= zan#i`yYmHq(zW~V>V2b1uQ^HuTO zAK=4%vxBa2J>%>5H0~+!J3@BuhkieIzu#Np{wRCgw@r`xB=f~Qmek?*u#WLY_xpOs z@DEGIuk=y;{PzL6{oYFKTfgc%S|{I2zSH;Y{x>D#-jw*?n*`UT$D@DH_g=>HTk9#~ z{jK$t@%>%;y1u#e{ml1A*FS6ArP;x`G#qsN9`AAJoI77^e_prGBg@X8kH#My>hg1N z-Fd-y@}hfxoG%hS(mDS*fBH#r>O(R4( zIGQJ!XU?vTTl4W?HaIz*6g-SuV{-od1b*{RGJ8?{xxT*sWnRcX->#n!ofZH95GY+B diff --git a/vignettes/.drake/data/f4b89e63bc92af79.rds b/vignettes/.drake/data/f4b89e63bc92af79.rds deleted file mode 100644 index 44e7e605ed608db5ad0c12aa7eae1076125aa669..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1217 zcmV;y1U~y8iwFP!000001Fcq1OdM4hAC?7n*=4&3B=%D0;Gr59c6Jw}YTc&`hz*St z43L&IdF&1_I?OC@W*4C~;nH*CvBrZ*J(?c$!m+W5Cr$L!o3R%!)`Y~=sELg;^M2pZ z9o&NAOP1gJe((G9`@T2J>{73yC^4n8E2hLcy=~`!_b26jGTujJqe`$s9Q(#!-?Guw zV6noNMSrov>093Vn7wpM;yBL9zbF^eVCQkJ%}9F~_VYL=%z;M&_Bz?WN_%uy>KcJQ z%JU+0P~BHi=N0%-o)PjxAH&qIJP+saEO^3f#8%tb**5-BzvE&wUljjq{1N&UnnMjd z;T2$A2C(L?L^EQqEXa9t%)5sBBiwvV-cJ-iMEv!;60gCY|6HEWJ(PIqYnlIQw?yYh z>E}RS1NJuTdE~n~AnPw8zOfIz&@aA&A8Vb%73d&bWUaQ2dY8dlpGtfO^%tpr1Xp+e z84bk0hrA~IXK{W3d1p~?3Al2%6-fu_qxc1!FC(rV>BHSefAU^z#jNYWeJ=uWl|M!om@t0H^&C{f(^_1)pj1RK0I$>edy^!9OLO))FGm&Rq?5zM26e#U;ndjqgRP-I<(^(biSr@LHjBfD-l^qVQ&pTDNUt= zi+rcX)w!h-h`x|e7dff!o#3w1u+*2eJebV1EiBztOX`F$nmX8iu=90WxO~NKkp7+p zZW`Qj!+Z_L)rDFd%ZEC2QB@12`~--EB#QY~dpr^_p07~OfGCaT=O+&_Ghk8&423;Y z;WfiFc~zYv?HW!7W(=!po0eL!E!VJg%jI-+{grjG?U-H%Z*SCfVT1>XDTBMJ zRv4#()3)VJvtl$2y1vZ2_O|VMoGomxE{**O)*>=HVb|7lwX)7lQ@7T1y5ZCt7c1%o z-qcOQqFyU}g9}@|9G1?``m+7L456 Date: Tue, 28 May 2019 14:03:44 -0400 Subject: [PATCH 34/35] oops, fix typo --- R/build_plans.R | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/R/build_plans.R b/R/build_plans.R index 67e7391..cb844fa 100644 --- a/R/build_plans.R +++ b/R/build_plans.R @@ -100,8 +100,8 @@ build_datasets_plan <- function(data_path = get_default_data_path(), } if (include_bbs_data) { - bbs_datasets = build_bbs_datasets_plan(data_path = !!data_path, - bbs_subset = !!bbs_subset) + bbs_datasets = build_bbs_datasets_plan(data_path = data_path, + bbs_subset = bbs_subset) datasets <- datasets %>% dplyr::bind_rows(bbs_datasets) From 0bd95f520ad6090f0a44883c421e463509d97f03 Mon Sep 17 00:00:00 2001 From: Hao Ye Date: Tue, 28 May 2019 14:05:33 -0400 Subject: [PATCH 35/35] correct documentation on process_bbs_route_region_data --- R/bbs_cleaning_functions.R | 2 +- man/process_bbs_route_region_data.Rd | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/R/bbs_cleaning_functions.R b/R/bbs_cleaning_functions.R index 42b2e4d..14264ea 100644 --- a/R/bbs_cleaning_functions.R +++ b/R/bbs_cleaning_functions.R @@ -69,7 +69,7 @@ prepare_bbs_ts_data <- function(start_yr = 1965, end_yr = 2017, min_num_yrs = 10 #' @description Correct and otherwise filter BBS species data (see #' \code{\link{combine_subspecies}} and \code{\link{filter_bbs_species}} for #' more info). Generate the abundance, covariate, and metadata tables and -#' write the output into an .Rds file to be re-read via readRDS. +#' return the combined object. #' @param bbs_data_table main bbs data table #' @param species_table table of species for BBS #' @return the processed BBS data diff --git a/man/process_bbs_route_region_data.Rd b/man/process_bbs_route_region_data.Rd index a8bd920..96b4aa8 100644 --- a/man/process_bbs_route_region_data.Rd +++ b/man/process_bbs_route_region_data.Rd @@ -18,5 +18,5 @@ the processed BBS data Correct and otherwise filter BBS species data (see \code{\link{combine_subspecies}} and \code{\link{filter_bbs_species}} for more info). Generate the abundance, covariate, and metadata tables and - write the output into an .Rds file to be re-read via readRDS. + return the combined object. }