From 9594d7a107b49059819b714309ccfd93deaaf701 Mon Sep 17 00:00:00 2001 From: leppott Date: Fri, 17 May 2019 11:09:00 -0400 Subject: [PATCH] v0.3.0.9018 Fixes for R v3.6.0, Issue #18 Updated badges in ReadMe. --- .Rbuildignore | 2 + .gitignore | 2 + DESCRIPTION | 5 +- NEWS | 12 +- NEWS.rmd | 10 + README.Rmd | 25 +- README.md | 31 +- doc/vignette_BioMonTools.html | 107 +- doc/vignette_MapTaxaObs.html | 86 +- inst/doc/ExcludedTaxaDecisionCrit.pdf | Bin 79166 -> 0 bytes inst/doc/vignette_BioMonTools.R | 317 ---- inst/doc/vignette_BioMonTools.Rmd | 502 ------ inst/doc/vignette_BioMonTools.html | 1342 ----------------- inst/doc/vignette_MapTaxaObs.R | 84 -- inst/doc/vignette_MapTaxaObs.Rmd | 117 -- inst/doc/vignette_MapTaxaObs.html | 665 -------- inst/extdata/BioMonTools_LibraryCreation.Rmd | 2 +- .../BioMonTools_LibraryCreation.nb.html | 92 +- man/MapTaxaObs.Rd | 3 +- 19 files changed, 247 insertions(+), 3157 deletions(-) delete mode 100644 inst/doc/ExcludedTaxaDecisionCrit.pdf delete mode 100644 inst/doc/vignette_BioMonTools.R delete mode 100644 inst/doc/vignette_BioMonTools.Rmd delete mode 100644 inst/doc/vignette_BioMonTools.html delete mode 100644 inst/doc/vignette_MapTaxaObs.R delete mode 100644 inst/doc/vignette_MapTaxaObs.Rmd delete mode 100644 inst/doc/vignette_MapTaxaObs.html diff --git a/.Rbuildignore b/.Rbuildignore index 5dda557b..cac5de07 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -2,3 +2,5 @@ ^\.Rproj\.user$ ^\.travis\.yml$ _test/ +^doc$ +^Meta$ diff --git a/.gitignore b/.gitignore index d89f3f3c..3285a5b6 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,5 @@ .Ruserdata _test/ +doc +Meta diff --git a/DESCRIPTION b/DESCRIPTION index 04644953..e8961bca 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: BioMonTools Type: Package Title: Tools for Biomonitoring and Bioassessment -Version: 0.3.0.9017 +Version: 0.3.0.9018 Author: c( person("Erik W.", "Leppo", email="Erik.Leppo@tetratech.com",role=c("aut","cre")), person("Jen", "Stamp", role="ctb"), @@ -29,5 +29,4 @@ Suggests: rmarkdown, XLConnect VignetteBuilder: knitr -StagedInstall: no -RoxygenNote: 6.0.1 +RoxygenNote: 6.1.1 diff --git a/NEWS b/NEWS index ac2fa633..84db9872 100644 --- a/NEWS +++ b/NEWS @@ -4,7 +4,7 @@ NEWS - #> Last Update: 2019-05-08 10:03:00 + #> Last Update: 2019-05-17 11:01:28 # Planned Updates @@ -22,6 +22,16 @@ NEWS # Version History +## Changes in Version 0.3.0.9018 (2019-05-17) + + - Fixes for R v3.6.0, Issue \#18 + - DESCRIPTION + - Remove StagedInstall: no + - README + - Add directions for fix for devtools. + - README + - Update badges. + ## Changes in Version 0.3.0.9017 (2019-05-08) - Metric names, fix those added in previous update, Issue \#3 diff --git a/NEWS.rmd b/NEWS.rmd index fbc65503..dcf2225b 100644 --- a/NEWS.rmd +++ b/NEWS.rmd @@ -32,6 +32,16 @@ cat(paste0("Last Update: ",Sys.time())) # Version History +## Changes in Version 0.3.0.9018 (2019-05-17) + +* Fixes for R v3.6.0, Issue #18 + + DESCRIPTION + - Remove StagedInstall: no + + README + - Add directions for fix for devtools. +* README + + Update badges. + ## Changes in Version 0.3.0.9017 (2019-05-08) * Metric names, fix those added in previous update, Issue #3 diff --git a/README.Rmd b/README.Rmd index 625de362..90083eb5 100644 --- a/README.Rmd +++ b/README.Rmd @@ -21,21 +21,22 @@ Suite of functions and tools for bioassessment and biomonitoring. Badges ----------- +[![Maintenance](https://img.shields.io/badge/Maintained%3F-yes-green.svg)](https://GitHub.com/leppott/BioMonTools/graphs/commit-activity) +[![GitHub license](https://img.shields.io/github/license/leppott/BioMonTools.svg)](https://github.com/leppott/BioMonTools/blob/master/LICENSE) [![Travis-CI Build Status](https://travis-ci.org/leppott/BioMonTools.svg?branch=master)](https://travis-ci.org/leppott/BioMonTools) -[![GitHub license](https://img.shields.io/github/license/Naereen/StrapDown.js.svg)](https://github.com/leppott/BioMonTools/blob/master/LICENSE) -[![GitHub release](https://img.shields.io/github/release/Naereen/StrapDown.js.svg)](https://GitHub.com/leppott/BioMonTools/releases/) -[![Github all releases](https://img.shields.io/github/downloads/Naereen/StrapDown.js/total.svg)](https://GitHub.com/leppott/BioMonTools/releases/) -[![GitHub issues](https://img.shields.io/github/issues/Naereen/StrapDown.js.svg)](https://GitHub.com/leppott/BioMonTools/issues/) +[![GitHub issues](https://img.shields.io/github/issues/leppott/BioMonTools.svg)](https://GitHub.com/leppott/BioMonTools/issues/) + +[![GitHub release](https://img.shields.io/github/release/leppott/BioMonTools.svg)](https://GitHub.com/leppott/BioMonTools/releases/) +[![Github all releases](https://img.shields.io/github/downloads/leppott/BioMonTools/total.svg)](https://GitHub.com/leppott/BioMonTools/releases/) Installation ------------ -library(devtools) #install if needed - -install_github("leppott/BioMonTools") - -To get vignettes need to use the following. +```{r, eval=FALSE} +library(devtools) #install if needed +Sys.setenv("TAR" = "internal") # needed for R v3.6.0 install_github("leppott/BioMonTools", force=TRUE, build_vignettes=TRUE) +``` Purpose ------------ @@ -54,4 +55,8 @@ the same database or spreadsheet. Only need to format data for use with these t Documentation ------------ -Vignette and install guide are planned for the future. +Vignette and install guide udpates are planned for the future. + +Issues +------------ +https://github.com/leppott/BioMonTools/issues diff --git a/README.md b/README.md index aa6c5e77..c27cf7d5 100644 --- a/README.md +++ b/README.md @@ -3,28 +3,33 @@ README-BioMonTools - #> Last Update: 2018-12-03 08:42:47 + #> Last Update: 2019-05-17 10:58:28 -Suite of functions and tools for bioassessment and biomonitoring. +Suite of functions and tools for bioassessment and +biomonitoring. ## Badges +[![Maintenance](https://img.shields.io/badge/Maintained%3F-yes-green.svg)](https://GitHub.com/leppott/BioMonTools/graphs/commit-activity) +[![GitHub +license](https://img.shields.io/github/license/leppott/BioMonTools.svg)](https://github.com/leppott/BioMonTools/blob/master/LICENSE) [![Travis-CI Build Status](https://travis-ci.org/leppott/BioMonTools.svg?branch=master)](https://travis-ci.org/leppott/BioMonTools) [![GitHub -license](https://img.shields.io/github/license/Naereen/StrapDown.js.svg)](https://github.com/leppott/BioMonTools/blob/master/LICENSE) +issues](https://img.shields.io/github/issues/leppott/BioMonTools.svg)](https://GitHub.com/leppott/BioMonTools/issues/) + [![GitHub -release](https://img.shields.io/github/release/Naereen/StrapDown.js.svg)](https://GitHub.com/leppott/BioMonTools/releases/) +release](https://img.shields.io/github/release/leppott/BioMonTools.svg)](https://GitHub.com/leppott/BioMonTools/releases/) [![Github all -releases](https://img.shields.io/github/downloads/Naereen/StrapDown.js/total.svg)](https://GitHub.com/leppott/BioMonTools/releases/) -[![GitHub -issues](https://img.shields.io/github/issues/Naereen/StrapDown.js.svg)](https://GitHub.com/leppott/BioMonTools/issues/) +releases](https://img.shields.io/github/downloads/leppott/BioMonTools/total.svg)](https://GitHub.com/leppott/BioMonTools/releases/) ## Installation -library(devtools) \#install if needed - -install\_github(“leppott/BioMonTools”) +``` r +library(devtools) #install if needed +Sys.setenv("TAR" = "internal") # needed for R v3.6.0 +install_github("leppott/BioMonTools", force=TRUE, build_vignettes=TRUE) +``` ## Purpose @@ -46,4 +51,8 @@ data for use with these tools. ## Documentation -Vignette and install guide are planned for the future. +Vignette and install guide udpates are planned for the future. + +## Issues + + diff --git a/doc/vignette_BioMonTools.html b/doc/vignette_BioMonTools.html index 9f524244..9231e263 100644 --- a/doc/vignette_BioMonTools.html +++ b/doc/vignette_BioMonTools.html @@ -12,7 +12,7 @@ - + Vignette, BioMonTools @@ -293,6 +293,9 @@ code > span.fu { color: #900; font-weight: bold; } code > span.er { color: #a61717; background-color: #e3d2d2; } + + + @@ -301,8 +304,8 @@

Vignette, BioMonTools

-

Erik.Leppo@tetratech.com

-

2019-01-14

+

Erik.Leppo@tetratech.com

+

2019-05-17

@@ -479,13 +482,13 @@

Data Preparation

9 7 0.0000000 -0.4023769 -0.2071307 -0.1188455 -0.0000000 -0.0370370 -0.3333333 -0.2592593 +40.237691 +20.713073 +11.884550 +0.000000 +3.703704 +33.333333 +25.925926 02087REF_Bug_2002-08-22_0 @@ -501,14 +504,14 @@

Data Preparation

21 7 1 -0.0313653 -0.1512915 -0.0553506 -0.6402214 -0.0526316 -0.5526316 -0.1842105 -0.0263158 +3.1365314 +15.129151 +5.535055 +64.022140 +5.263158 +55.263158 +18.421053 +2.631579 03013CSR_Bug_2003-07-01_0 @@ -525,13 +528,13 @@

Data Preparation

2 4 0.0000000 -0.0295858 -0.1025641 -0.6015779 -0.0000000 -0.1875000 -0.1250000 -0.2500000 +2.958580 +10.256410 +60.157791 +0.000000 +18.750000 +12.500000 +25.000000 03053CSR_Bug_2003-08-14_0 @@ -547,14 +550,14 @@

Data Preparation

18 6 3 -0.0331588 -0.4275742 -0.1570681 -0.0907504 -0.0277778 -0.5000000 -0.1666667 -0.0833333 +3.3158813 +42.757417 +15.706806 +9.075044 +2.777778 +50.000000 +16.666667 +8.333333 03054CSR_Bug_2003-08-18_0 @@ -570,14 +573,14 @@

Data Preparation

3 1 3 -0.0053763 -0.0645161 -0.0537634 -0.7491039 -0.0769231 -0.2307692 -0.0769231 -0.2307692 +0.5376344 +6.451613 +5.376344 +74.910394 +7.692308 +23.076923 +7.692308 +23.076923 06012CSR_Bug_2006-09-05_0 @@ -593,14 +596,14 @@

Data Preparation

17 11 4 -0.0110092 -0.3284404 -0.4311927 -0.1853211 -0.0250000 -0.4250000 -0.2750000 -0.1000000 +1.1009174 +32.844037 +43.119266 +18.532110 +2.500000 +42.500000 +27.500000 +10.000000 @@ -1104,7 +1107,7 @@

rarify

,abund="N_Taxa",subsiz=mySize, mySeed=Seed_US) #> Rarify of samples complete. #> Number of samples = 12 -#> Execution time (sec) = 0.0200000000000031 +#> Execution time (sec) = 0 # view results #dim(bugs_mysize) @@ -1292,8 +1295,8 @@

Flags

individuals, small -75 -603 +80 +598 Low density (ft2) diff --git a/doc/vignette_MapTaxaObs.html b/doc/vignette_MapTaxaObs.html index bbae97ca..dcc0722c 100644 --- a/doc/vignette_MapTaxaObs.html +++ b/doc/vignette_MapTaxaObs.html @@ -12,7 +12,7 @@ - + Vignette, Taxa Maps @@ -293,6 +293,9 @@ code > span.fu { color: #900; font-weight: bold; } code > span.er { color: #a61717; background-color: #e3d2d2; } + + + @@ -301,8 +304,8 @@

Vignette, Taxa Maps

-

Erik.Leppo@tetratech.com

-

2019-01-14

+

Erik.Leppo@tetratech.com

+

2019-05-17

@@ -452,47 +455,52 @@

Example, ggplot

+Lat <- "Latitude" +Long <- "Longitude" + + + + +# Base Map +m1 <- ggplot(data=subset(map_data(myDB), region %in% c(myRegion))) + + geom_polygon(aes(x=long, y=lat, group=group), fill="light gray", color="black") + + coord_fixed(1.3) + theme_void() +# Add points (all) +m1 <- m1 + geom_point(data=df_obs, aes(df_obs[,Long], df_obs[,Lat]), fill=NA, color="gray") +# Add points (Taxa) +m1 <- m1 + geom_point(data=df_map, aes(df_map[,Long], df_map[,Lat]), color="blue") +# Map Title (center) +m1 <- m1 + labs(title=myTaxa) + theme(plot.title = element_text(hjust = 0.5)) +# Caption (left justified) +m1 <- m1 + labs(caption="caption1 \n caption2") + theme(plot.caption = element_text(hjust=0)) + +# Show Results +kable(head(df_obs)) diff --git a/inst/doc/ExcludedTaxaDecisionCrit.pdf b/inst/doc/ExcludedTaxaDecisionCrit.pdf deleted file mode 100644 index ac6b77a551face63a55c98172360ac43869b4889..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 79166 zcmc$Fbxxc|Sd ziRjF(tnAFJ%!vMF)KIBNNHGDKIgzQ#PG(1t5rA9(R)CY4EwX?Bi-L_K$kf%w7i0kd zvM2+9yeu*ReE=sf8-SaG!;nP*z|9Nf;$o2maIy08aD z68ZubJU~-Z4l{EePEHFp3ky>&b|9-Ikc)?%-NKxm*OE&}fQOCMg2U8|4Ft5{VK)Vu za&mFASpY3qc{tg5S$TN5gbam*+}vG3rVhvm-nr%$XeK5WzR)A!NU_uDNU@CPNU@L7Q0md`R|(Exe7v&cGp z>Jc|&k#cf${}hn=OvHaHlVSs~{VUIegjjTx&1^yD|IEued

nZQAFA_~)um1Ka>? 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%0DYp6gM!r!vX?XUlkuUmPv|z)>%F9 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 diff --git a/inst/doc/vignette_BioMonTools.R b/inst/doc/vignette_BioMonTools.R deleted file mode 100644 index 7ac3a404..00000000 --- a/inst/doc/vignette_BioMonTools.R +++ /dev/null @@ -1,317 +0,0 @@ -## ----rmd_setup, include = FALSE------------------------------------------ -library(knitr) -knitr::opts_chunk$set( - collapse = TRUE, - comment = "#>" -) - -## ----Pkg_Install, eval=FALSE--------------------------------------------- -# # Installing the BioMonTools library (with the vignette) from GitHub -# library(devtools) -# install_github("leppott/BioMonTools", force=TRUE, build_vignettes=TRUE) - -## ----Pkg_Help, eval=FALSE------------------------------------------------ -# help(package="BioMonTools") - -## ----MetricValues_Keep2-------------------------------------------------- -# Packages -library(readxl) -library(knitr) -library(BioMonTools) - -# Load Data -df.data <- read_excel(system.file("./extdata/Data_Benthos.xlsx" - , package="BioMonTools") - , guess_max = 10^6) -# Columns to keep -myCols <- c("Area_mi2", "SurfaceArea", "Density_m2", "Density_ft2") - -# Run Function -df.metval <- metric.values(df.data, "bugs", fun.cols2keep=myCols) -# Metrics of Interest -## thermal indicator (_ti_) -#names(df.metval)[grepl("_ti_", names(df.metval))] -col.met2keep <- c("ni_total", "nt_total", "nt_ti_c", "nt_ti_cc", "nt_ti_cw" - , "nt_ti_w", "pi_ti_c", "pi_ti_cc", "pi_ti_cw", "pi_ti_w" - , "pt_ti_c", "pt_ti_cc", "pt_ti_cw", "pt_ti_w") -col.ID <- c("SAMPLEID", toupper(myCols), "INDEX_NAME", "INDEX_REGION") -# Ouput -df.metval.ci <- df.metval[, c(col.ID, col.met2keep)] -# RMD table -kable(head(df.metval.ci), caption = "Metric Calculation, select metrics") - -## ----Excl01-------------------------------------------------------------- -# Packages -library(readxl) -library(dplyr) -library(lazyeval) -library(knitr) - -# Data -df_samps_bugs <- read_excel(system.file("./extdata/Data_Benthos.xlsx" - , package="BioMonTools") - , guess_max=10^6) - -# Variables -SampID <- "SampleID" -TaxaID <- "TaxaID" -TaxaCount <- "N_Taxa" -Exclude <- "Exclude_New" -TaxaLevels <- c("Kingdom" - , "Phylum" - , "SubPhylum" - , "Class" - , "SubClass" - , "Order" - , "SubOrder" - , "SuperFamily" - , "Family" - , "SubFamily" - , "Tribe" - , "Genus" - , "SubGenus" - , "Species" - , "Variety") -# Taxa that should be treated as equivalent -Exceptions <- data.frame("TaxaID"=c("Sphaeriidae"), "PhyloID"=c("Pisidiidae")) - -# Filter Data -# df_samptax <- filter(df_samps_bugs, !!as.name(SampID) == "08BEA3478__2013-08-21_0") -# df_tst_small <- markExcluded(df_samptax, SampID, TaxaID, TaxaCount, TaxaLevels, Exceptions, Exclude) - -# EXAMPLE 1 -df_tst <- markExcluded(df_samps_bugs, SampID="SampleID", TaxaID="TaxaID", TaxaCount = "N_Taxa" - , Exclude="Exclude_New", TaxaLevels=TaxaLevels, Exceptions=Exceptions) - -# Compare -df_compare <- dplyr::summarise(dplyr::group_by(df_tst, SampleID) - , Exclude_Import=sum(Exclude) - , Exclude_R=sum(Exclude_New)) -df_compare$Diff <- df_compare$Exclude_Import - df_compare$Exclude_R -# -tbl_diff <- table(df_compare$Diff) -#kable(tbl_diff) -# sort -df_compare <- df_compare %>% arrange(desc(Diff)) - -# Number with issues -#sum(abs(df_compare$Diff)) -# total samples -#nrow(df_compare) - -# confusion matrix -tbl_results <- table(df_tst$Exclude, df_tst$Exclude_New, useNA = "ifany") -# -# Show differences -kable(tbl_results, caption="Confusion Matrix") -# samples with differences -samp_diff <- as.data.frame(df_compare[df_compare[,"Diff"]!=0, "SampleID"]) -# results for only those with differences -df_tst_diff <- df_tst[df_tst[,"SampleID"] %in% samp_diff$SampleID, ] -# add diff field -df_tst_diff$Exclude_Diff <- df_tst_diff$Exclude - df_tst_diff$Exclude_New - -# Classification Performance Metrics -class_TP <- tbl_results[2,2] # True Positive -class_FN <- tbl_results[2,1] # False Negative -class_FP <- tbl_results[1,2] # False Positive -class_TN <- tbl_results[1,1] # True Negative -class_n <- sum(tbl_results) # total -# -# sensitivity (recall); TP / (TP+FN); measure model to ID true positives -class_sens <- class_TP / (class_TP + class_FN) -# precision; TP / (TP+FP); accuracy of model positives -class_prec <- class_TP / (class_TP + class_FP) -# specifity; TN / (TN + FP); measure model to ID true negatives -class_spec <- class_TN / (class_TN + class_FP) -# overall accuracy; (TP + TN) / all cases; accuracy of all classifications -class_acc <- (class_TP + class_TN) / class_n -# F1; 2 * (class_prec*class_sens) / (class_prec+class_sens) -## balance of precision and recall -class_F1 <- 2 * (class_prec * class_sens) / (class_prec + class_sens) -# -results_names <- c("Sensitivity (Recall)", "Precision", "Specificity", "OVerall Accuracy", "F1") -results_values <- c(class_sens, class_prec, class_spec, class_acc, class_F1) -# -tbl_class <- data.frame(results_names, results_values) -names(tbl_class) <- c("Performance Metrics", "Percent") -tbl_class$Percent <- round(tbl_class$Percent *100, 2) -kable(tbl_class, caption="Classification Performance Metrics") - - -## ----Excl02-------------------------------------------------------------- -# Packages -library(readxl) -library(dplyr) -library(lazyeval) -library(knitr) - -# Data -df_samps_bugs <- read_excel(system.file("./extdata/Data_Benthos.xlsx" - , package="BioMonTools") - , guess_max=10^6) - -# Variables -SampID <- "SampleID" -TaxaID <- "TaxaID" -TaxaCount <- "N_Taxa" -Exclude <- "Exclude_New" -TaxaLevels <- c("Kingdom" - , "Phylum" - , "SubPhylum" - , "Class" - , "SubClass" - , "Order" - , "SubOrder" - , "SuperFamily" - , "Family" - , "SubFamily" - , "Tribe" - , "Genus" - , "SubGenus" - , "Species" - , "Variety") -# Taxa that should be treated as equivalent -Exceptions <- NA - -# EXAMPLE 2 -## No Exceptions - -df_tst2 <- markExcluded(df_samps_bugs, SampID="SampleID", TaxaID="TaxaID", TaxaCount = "N_Taxa" - , Exclude="Exclude_New", TaxaLevels=TaxaLevels, Exceptions=NA) - -# Compare -df_compare2 <- dplyr::summarise(dplyr::group_by(df_tst2, SampleID) - , Exclude_Import=sum(Exclude) - , Exclude_R=sum(Exclude_New)) -df_compare2$Diff <- df_compare2$Exclude_Import - df_compare2$Exclude_R -# -tbl_diff2 <- table(df_compare2$Diff) -#kable(tbl_diff2) -# sort -df_compare2 <- df_compare2 %>% arrange(desc(Diff)) - -# Number with issues -#sum(abs(df_compare2$Diff)) -# total samples -#nrow(df_compare2) - -# confusion matrix -tbl_results2 <- table(df_tst2$Exclude, df_tst2$Exclude_New, useNA = "ifany") -# -# Show differences -kable(tbl_results2, caption="Confusion Matrix") -kable(df_compare2[1:10, ]) -kable(tail(df_compare2)) -# samples with differences -(samp_diff2 <- as.data.frame(df_compare2[df_compare2[,"Diff"]!=0, "SampleID"])) -# results for only those with differences -df_tst_diff2 <- filter(df_tst2, SampleID %in% samp_diff2$SampleID) -# add diff field -df_tst_diff2$Exclude_Diff <- df_tst_diff2$Exclude - df_tst_diff2$Exclude_New - -# Classification Performance Metrics -class_TP2 <- tbl_results2[2,2] # True Positive -class_FN2 <- tbl_results2[2,1] # False Negative -class_FP2 <- tbl_results2[1,2] # False Positive -class_TN2 <- tbl_results2[1,1] # True Negative -class_n2 <- sum(tbl_results2) # total -# -# sensitivity (recall); TP / (TP+FN); measure model to ID true positives -class_sens2 <- class_TP2 / (class_TP2 + class_FN2) -# precision; TP / (TP+FP); accuracy of model positives -class_prec2 <- class_TP2 / (class_TP2 + class_FP2) -# specifity; TN / (TN + FP); measure model to ID true negatives -class_spec2 <- class_TN2 / (class_TN2 + class_FP2) -# overall accuracy; (TP + TN) / all cases; accuracy of all classifications -class_acc2 <- (class_TP2 + class_TN2) / class_n2 -# F1; 2 * (class_prec*class_sens) / (class_prec+class_sens) -## balance of precision and recall -class_F12 <- 2 * (class_prec2 * class_sens2) / (class_prec2 + class_sens2) -# -results_names2 <- c("Sensitivity (Recall)", "Precision", "Specificity", "OVerall Accuracy", "F1") -results_values2 <- c(class_sens2, class_prec2, class_spec2, class_acc2, class_F12) -# -tbl_class2 <- data.frame(results_names2, results_values2) -names(tbl_class2) <- c("Performance Metrics", "Percent") -tbl_class2$Percent <- round(tbl_class2$Percent *100, 2) -kable(tbl_class2, caption="Classification Performance Metrics") - -## ----rarify-------------------------------------------------------------- -# Subsample to 500 organisms (from over 500 organisms) for 12 samples. - -# Packages -library(knitr) - -# load bio data -df_biodata <- data_bio2rarify -#dim(df_biodata) -#kable(head(df_biodata)) - -# subsample -mySize <- 500 -Seed_OR <- 18590214 -Seed_WA <- 18891111 -Seed_US <- 17760704 -bugs_mysize <- rarify(inbug=df_biodata, sample.ID="SampleID" - ,abund="N_Taxa",subsiz=mySize, mySeed=Seed_US) - -# view results -#dim(bugs_mysize) -#kable(head(bugs_mysize)) - -# Compare pre- and post- subsample counts -df_compare <- merge(df_biodata, bugs_mysize, by=c("SampleID", "TaxaID") - , suffixes = c("_Orig","_500")) -df_compare <- df_compare[,c("SampleID", "TaxaID", "N_Taxa_Orig", "N_Taxa_500")] -kable(head(df_compare), caption = "Comparison, by Sample") - -# compare totals -tbl_totals <- aggregate(cbind(N_Taxa_Orig, N_Taxa_500) ~ SampleID, df_compare, sum) -kable(head(tbl_totals), caption = "Comparison, sample totals") - -## Not run: -# save the data -#write.table(bugs_mysize, paste("bugs",mySize,"txt",sep="."),sep="\t") -## End(Not run) - -## ----Flags, echo=TRUE, eval=TRUE----------------------------------------- -# Packages -library(readxl) -library(reshape2) -library(knitr) -library(BioMonTools) - -# Import -df.samps.bugs <- read_excel(system.file("./extdata/Data_Benthos.xlsx" - , package="BioMonTools") - , guess_max = 10^6) - -# Calculate Metrics -# Extra columns to keep in results -keep.cols <- c("Area_mi2", "SurfaceArea", "Density_m2", "Density_ft2") -# Run Function -df.metrics <- metric.values(df.samps.bugs, "bugs", fun.cols2keep = keep.cols) - -# Flags -# Import QC Checks -df.checks <- read_excel(system.file("./extdata/MetricFlags.xlsx" - , package="BioMonTools"), sheet="Flags") -# Run Function -df.flags <- qc.checks(df.metrics, df.checks) - -# Change terminology; PASS/FAIL to NA/flag -df.flags[,"FLAG"][df.flags[,"FLAG"]=="FAIL"] <- "flag" -df.flags[, "FLAG"][df.flags[,"FLAG"]=="PASS"] <- NA -# long to wide format -df.flags.wide <- dcast(df.flags, SAMPLEID ~ CHECKNAME, value.var="FLAG") -# Calc number of "flag"s by row. -df.flags.wide$NumFlags <- rowSums(df.flags.wide=="flag", na.rm=TRUE) -# Rearrange columns -NumCols <- ncol(df.flags.wide) -df.flags.wide <- df.flags.wide[, c(1, NumCols, 2:(NumCols-1))] -# View(df.flags.wide) - -# Summarize Results -kable(table(df.flags[,"CHECKNAME"], df.flags[,"FLAG"], useNA="ifany")) - diff --git a/inst/doc/vignette_BioMonTools.Rmd b/inst/doc/vignette_BioMonTools.Rmd deleted file mode 100644 index b38826c2..00000000 --- a/inst/doc/vignette_BioMonTools.Rmd +++ /dev/null @@ -1,502 +0,0 @@ ---- -title: "Vignette, BioMonTools" -author: "Erik.Leppo@tetratech.com" -date: "`r Sys.Date()`" -output: rmarkdown::html_vignette -vignette: > - %\VignetteIndexEntry{BioMonTools} - %\VignetteEngine{knitr::rmarkdown} - %\VignetteEncoding{UTF-8} ---- - -```{r rmd_setup, include = FALSE} -library(knitr) -knitr::opts_chunk$set( - collapse = TRUE, - comment = "#>" -) -``` -# Purpose -The `BioMonTools` package was created to enable users to have a common set of tools -for bioassessment and biomonitoring data. - -# Installation -The package is hosted on GitHub (https://github.com/leppott/BioMonTools) and can be -installed using the following lines of code. It is necessary to install the -`devtools` package. - -```{r Pkg_Install, eval=FALSE} -# Installing the BioMonTools library (with the vignette) from GitHub -library(devtools) -install_github("leppott/BioMonTools", force=TRUE, build_vignettes=TRUE) -``` - -# Help -After the `BioMonTools` package has been installed running the following line of code -will open the help file with links to all functions. -```{r Pkg_Help, eval=FALSE} -help(package="BioMonTools") -``` - -# Package Functions -The suite of functions in the `BioMonTools` package are presented below. - -* metric.values -* markExcluded -* rarify - -## metric.values -Calculate metric values from a data frame with taxa by sample with fully qualified master taxa information. All percent metric results are 0-1. - -### Data Preparation -There are a number of required fields for the input file. If any fields are -missing the user will be prompted as to which are missing and the user can decide -whether to continue or quit. If the user continues, the missing fields will be -added but will be filled with zero or NA (as appropriate). Any metrics based on -the missing fields will not be valid. - -Required Fields: - -* SAMPLEID - - + Unique sample identifier - - + Valid entries: character or number, must be unique - -* TAXAID - - + Unique taxa identifier - - + Valid entries: character or number, must be unique - -* N_TAXA - - + Number of individuals - - + Valid entries: number - -* EXCLUDE - - + Non-unique/non-distinct taxa are excluded from richness metric calculations - but are counted in the other metrics. Appendix B of the ‘BCGcalc_README_20180919’ - Word document describes the Excluded Taxa Decision Criteria that was used during - BCG model calibration. - - + Valid entries: TRUE or FALSE - - + Non-unique/non-distinct taxa should be entered as "TRUE" - -* NONTARGET - - + Non-target taxa are not part of the intended capture list; e.g., fish, herps, - water column taxa. They are excluded from all metric calculations. - - + Valid entries: TRUE or FALSE. - - + NonTarget taxa should be entered as "TRUE" - -* INDEX_NAME - - + Name of the BCG rules worksheet in the ‘Rules’ file (in the ‘extdata’ folder) - that the R code is referencing. - - + Valid entries for the Puget Lowlands/Willamette Valley model: - BCG_PacNW_v1_500ct or BCG_PacNW_v1_300ct. - -* SITE_TYPE - - + Select which BCG model to apply: Low (lo) gradient (<1% NHD+ v2 flowline - slope) or high (hi) gradient (≥ 1% NHD+ v2 flowline slope). - - + Valid entries: “hi” or “lo”. - -* PHYLUM, SUBPHYLUM, CLASS, ORDER, FAMILY, SUBFAMILY, TRIBE, GENUS - - + Phylogeny - - + Other phylogenetic rankings (e.g., SubOrder or SuperFamily) can be included - but are not used in the current metric calculations. - - + Valid entries: text - -* BCG_Attr - - + BCG attribute assignments (for example, Stamp and Gerritsen 2018). - - + Valid entries: 1i, 1m, 2, 3, 4, 5, 6; if not available, leave blank or enter ‘NA’. - -* FFG, HABIT, LIFE_CYCLE, TOLVAL, THERMAL_INDICATOR - - + FFG - - - Valid values for FFG: CG, CF, PR, SC, SH - - - Function feeding group entries. - - + HABIT - - - Valid values for HABIT: BU, CB, CN, SP, SW - - - Habit designations. - - + LIFE_CYLCE - - - Valid values for LIFE_CYCLE: UNI, SEMI, MULTI - - - Life cycle designations. - - + THERMAL_INDICATOR - - - Valid values for THERMAL_INDICATOR: COLD, COLD_COOL, COOL_WARM, WARM - -Fields that are optional can be in the output (see examples below). - -```{r MetricValues_Keep2} -# Packages -library(readxl) -library(knitr) -library(BioMonTools) - -# Load Data -df.data <- read_excel(system.file("./extdata/Data_Benthos.xlsx" - , package="BioMonTools") - , guess_max = 10^6) -# Columns to keep -myCols <- c("Area_mi2", "SurfaceArea", "Density_m2", "Density_ft2") - -# Run Function -df.metval <- metric.values(df.data, "bugs", fun.cols2keep=myCols) -# Metrics of Interest -## thermal indicator (_ti_) -#names(df.metval)[grepl("_ti_", names(df.metval))] -col.met2keep <- c("ni_total", "nt_total", "nt_ti_c", "nt_ti_cc", "nt_ti_cw" - , "nt_ti_w", "pi_ti_c", "pi_ti_cc", "pi_ti_cw", "pi_ti_w" - , "pt_ti_c", "pt_ti_cc", "pt_ti_cw", "pt_ti_w") -col.ID <- c("SAMPLEID", toupper(myCols), "INDEX_NAME", "INDEX_REGION") -# Ouput -df.metval.ci <- df.metval[, c(col.ID, col.met2keep)] -# RMD table -kable(head(df.metval.ci), caption = "Metric Calculation, select metrics") -``` - -## markExcluded -Takes as an input data frame with Sample ID, Taxa ID, and phlogenetic name fields and returns a similar dataframe with a column for "excluded" taxa (TRUE or FALSE). - -Excluded taxa are refered to by multiple names; ambiguous, non-distinct, and non-unique. The "excluded" name was chosen so as to be consistent with "non-target" taxa. That is, taxa marked as "TRUE" are treated as undesireables. Excluded taxa are those that are present in a sample when taxa of the same group are present in the same sample are identified finer level. That is, the parent is marked as excluded when child taxa are present in the same sample. - -The excluded taxa are referenced in the metric values function. These taxa are removed from the taxa richness metrics. This is because these are coarser level taxa. - -Exceptions is a 2 column data frame of synonyms or other exceptions. Column 1 is the name used in the TaxaID column the input data frame (df_samptax). Column 2 is the name used in the TaxaLevels columns of the input data frame (df_samptax). The phylogenetic columns (TaxaLevels) will be modified from Column 2 of the Exceptions data frame to match Column 1 of the Exceptions data frame. This ensures that the algorithm for markExcluded works properly. The changes will not be stored and the original names provided in the input data frame (df_samptax) will be returned in the final result. The function example below includes a practical case. - -Taxa Levels are phylogenetic names that are to be checked. They should be listed in order from course (kingdom) to fine (species). Names not appearing in the data will be skipped. - -The spelling of names must be consistent (including case) for this function to produce the intended output. - -Returns a data frame of df_samptax with an additional column, ExcludedTaxa. - -```{r Excl01} -# Packages -library(readxl) -library(dplyr) -library(lazyeval) -library(knitr) - -# Data -df_samps_bugs <- read_excel(system.file("./extdata/Data_Benthos.xlsx" - , package="BioMonTools") - , guess_max=10^6) - -# Variables -SampID <- "SampleID" -TaxaID <- "TaxaID" -TaxaCount <- "N_Taxa" -Exclude <- "Exclude_New" -TaxaLevels <- c("Kingdom" - , "Phylum" - , "SubPhylum" - , "Class" - , "SubClass" - , "Order" - , "SubOrder" - , "SuperFamily" - , "Family" - , "SubFamily" - , "Tribe" - , "Genus" - , "SubGenus" - , "Species" - , "Variety") -# Taxa that should be treated as equivalent -Exceptions <- data.frame("TaxaID"=c("Sphaeriidae"), "PhyloID"=c("Pisidiidae")) - -# Filter Data -# df_samptax <- filter(df_samps_bugs, !!as.name(SampID) == "08BEA3478__2013-08-21_0") -# df_tst_small <- markExcluded(df_samptax, SampID, TaxaID, TaxaCount, TaxaLevels, Exceptions, Exclude) - -# EXAMPLE 1 -df_tst <- markExcluded(df_samps_bugs, SampID="SampleID", TaxaID="TaxaID", TaxaCount = "N_Taxa" - , Exclude="Exclude_New", TaxaLevels=TaxaLevels, Exceptions=Exceptions) - -# Compare -df_compare <- dplyr::summarise(dplyr::group_by(df_tst, SampleID) - , Exclude_Import=sum(Exclude) - , Exclude_R=sum(Exclude_New)) -df_compare$Diff <- df_compare$Exclude_Import - df_compare$Exclude_R -# -tbl_diff <- table(df_compare$Diff) -#kable(tbl_diff) -# sort -df_compare <- df_compare %>% arrange(desc(Diff)) - -# Number with issues -#sum(abs(df_compare$Diff)) -# total samples -#nrow(df_compare) - -# confusion matrix -tbl_results <- table(df_tst$Exclude, df_tst$Exclude_New, useNA = "ifany") -# -# Show differences -kable(tbl_results, caption="Confusion Matrix") -# samples with differences -samp_diff <- as.data.frame(df_compare[df_compare[,"Diff"]!=0, "SampleID"]) -# results for only those with differences -df_tst_diff <- df_tst[df_tst[,"SampleID"] %in% samp_diff$SampleID, ] -# add diff field -df_tst_diff$Exclude_Diff <- df_tst_diff$Exclude - df_tst_diff$Exclude_New - -# Classification Performance Metrics -class_TP <- tbl_results[2,2] # True Positive -class_FN <- tbl_results[2,1] # False Negative -class_FP <- tbl_results[1,2] # False Positive -class_TN <- tbl_results[1,1] # True Negative -class_n <- sum(tbl_results) # total -# -# sensitivity (recall); TP / (TP+FN); measure model to ID true positives -class_sens <- class_TP / (class_TP + class_FN) -# precision; TP / (TP+FP); accuracy of model positives -class_prec <- class_TP / (class_TP + class_FP) -# specifity; TN / (TN + FP); measure model to ID true negatives -class_spec <- class_TN / (class_TN + class_FP) -# overall accuracy; (TP + TN) / all cases; accuracy of all classifications -class_acc <- (class_TP + class_TN) / class_n -# F1; 2 * (class_prec*class_sens) / (class_prec+class_sens) -## balance of precision and recall -class_F1 <- 2 * (class_prec * class_sens) / (class_prec + class_sens) -# -results_names <- c("Sensitivity (Recall)", "Precision", "Specificity", "OVerall Accuracy", "F1") -results_values <- c(class_sens, class_prec, class_spec, class_acc, class_F1) -# -tbl_class <- data.frame(results_names, results_values) -names(tbl_class) <- c("Performance Metrics", "Percent") -tbl_class$Percent <- round(tbl_class$Percent *100, 2) -kable(tbl_class, caption="Classification Performance Metrics") - -``` - -The same data with no "exceptions" leaves 8 records misclassified. -```{r Excl02} -# Packages -library(readxl) -library(dplyr) -library(lazyeval) -library(knitr) - -# Data -df_samps_bugs <- read_excel(system.file("./extdata/Data_Benthos.xlsx" - , package="BioMonTools") - , guess_max=10^6) - -# Variables -SampID <- "SampleID" -TaxaID <- "TaxaID" -TaxaCount <- "N_Taxa" -Exclude <- "Exclude_New" -TaxaLevels <- c("Kingdom" - , "Phylum" - , "SubPhylum" - , "Class" - , "SubClass" - , "Order" - , "SubOrder" - , "SuperFamily" - , "Family" - , "SubFamily" - , "Tribe" - , "Genus" - , "SubGenus" - , "Species" - , "Variety") -# Taxa that should be treated as equivalent -Exceptions <- NA - -# EXAMPLE 2 -## No Exceptions - -df_tst2 <- markExcluded(df_samps_bugs, SampID="SampleID", TaxaID="TaxaID", TaxaCount = "N_Taxa" - , Exclude="Exclude_New", TaxaLevels=TaxaLevels, Exceptions=NA) - -# Compare -df_compare2 <- dplyr::summarise(dplyr::group_by(df_tst2, SampleID) - , Exclude_Import=sum(Exclude) - , Exclude_R=sum(Exclude_New)) -df_compare2$Diff <- df_compare2$Exclude_Import - df_compare2$Exclude_R -# -tbl_diff2 <- table(df_compare2$Diff) -#kable(tbl_diff2) -# sort -df_compare2 <- df_compare2 %>% arrange(desc(Diff)) - -# Number with issues -#sum(abs(df_compare2$Diff)) -# total samples -#nrow(df_compare2) - -# confusion matrix -tbl_results2 <- table(df_tst2$Exclude, df_tst2$Exclude_New, useNA = "ifany") -# -# Show differences -kable(tbl_results2, caption="Confusion Matrix") -kable(df_compare2[1:10, ]) -kable(tail(df_compare2)) -# samples with differences -(samp_diff2 <- as.data.frame(df_compare2[df_compare2[,"Diff"]!=0, "SampleID"])) -# results for only those with differences -df_tst_diff2 <- filter(df_tst2, SampleID %in% samp_diff2$SampleID) -# add diff field -df_tst_diff2$Exclude_Diff <- df_tst_diff2$Exclude - df_tst_diff2$Exclude_New - -# Classification Performance Metrics -class_TP2 <- tbl_results2[2,2] # True Positive -class_FN2 <- tbl_results2[2,1] # False Negative -class_FP2 <- tbl_results2[1,2] # False Positive -class_TN2 <- tbl_results2[1,1] # True Negative -class_n2 <- sum(tbl_results2) # total -# -# sensitivity (recall); TP / (TP+FN); measure model to ID true positives -class_sens2 <- class_TP2 / (class_TP2 + class_FN2) -# precision; TP / (TP+FP); accuracy of model positives -class_prec2 <- class_TP2 / (class_TP2 + class_FP2) -# specifity; TN / (TN + FP); measure model to ID true negatives -class_spec2 <- class_TN2 / (class_TN2 + class_FP2) -# overall accuracy; (TP + TN) / all cases; accuracy of all classifications -class_acc2 <- (class_TP2 + class_TN2) / class_n2 -# F1; 2 * (class_prec*class_sens) / (class_prec+class_sens) -## balance of precision and recall -class_F12 <- 2 * (class_prec2 * class_sens2) / (class_prec2 + class_sens2) -# -results_names2 <- c("Sensitivity (Recall)", "Precision", "Specificity", "OVerall Accuracy", "F1") -results_values2 <- c(class_sens2, class_prec2, class_spec2, class_acc2, class_F12) -# -tbl_class2 <- data.frame(results_names2, results_values2) -names(tbl_class2) <- c("Performance Metrics", "Percent") -tbl_class2$Percent <- round(tbl_class2$Percent *100, 2) -kable(tbl_class2, caption="Classification Performance Metrics") -``` - -## rarify -The rarify function subsamples count data to a fixed count per sample. It -takes as an input a 3 column data frame (SampleID, TaxonID, Count) and returns a -similar dataframe with revised Counts. The names of the columns does not matter -as they are specified in the code. Any non-count taxa (e.g., fish in a bug sample) -should be removed prior to using the `rarify` function. The function code is -from USEPA Corvallis John Van Sickle's R code for RIVPACS (v1.0, 2005-06-10) and -was tweaked for the addition of a user provided seed so repeatable results can -be obtained. - -The other function inputs are subsample size (target number of organisms in each -sample) and seed. The seed is given so the results can be reproduced from the -same input file. If no seed is given a random seed is used. An example seed is -the date of admission to the Union for each state where the data is collected -(e.g., Washington is 18891111). These values can be found on Wikipedia on the -right sidebar for each State. - -If you are running the 500-count BCG model and any of your samples have more -than 600 organisms (the upper limit for the model), you should randomly subsample -your data to 600 (600 is +20% of the 500-count target). This is done to make -richness metrics comparable across the 500-count samples. You can do this with -the Rarify routine. - -```{r rarify} -# Subsample to 500 organisms (from over 500 organisms) for 12 samples. - -# Packages -library(knitr) - -# load bio data -df_biodata <- data_bio2rarify -#dim(df_biodata) -#kable(head(df_biodata)) - -# subsample -mySize <- 500 -Seed_OR <- 18590214 -Seed_WA <- 18891111 -Seed_US <- 17760704 -bugs_mysize <- rarify(inbug=df_biodata, sample.ID="SampleID" - ,abund="N_Taxa",subsiz=mySize, mySeed=Seed_US) - -# view results -#dim(bugs_mysize) -#kable(head(bugs_mysize)) - -# Compare pre- and post- subsample counts -df_compare <- merge(df_biodata, bugs_mysize, by=c("SampleID", "TaxaID") - , suffixes = c("_Orig","_500")) -df_compare <- df_compare[,c("SampleID", "TaxaID", "N_Taxa_Orig", "N_Taxa_500")] -kable(head(df_compare), caption = "Comparison, by Sample") - -# compare totals -tbl_totals <- aggregate(cbind(N_Taxa_Orig, N_Taxa_500) ~ SampleID, df_compare, sum) -kable(head(tbl_totals), caption = "Comparison, sample totals") - -## Not run: -# save the data -#write.table(bugs_mysize, paste("bugs",mySize,"txt",sep="."),sep="\t") -## End(Not run) -``` -### Flags -Results should be interpreted with caution if they are flagged for any of the -criteria listed below. It is up to the user's discretion as to how to handled flagged samples. - -```{r Flags, echo=TRUE, eval=TRUE} -# Packages -library(readxl) -library(reshape2) -library(knitr) -library(BioMonTools) - -# Import -df.samps.bugs <- read_excel(system.file("./extdata/Data_Benthos.xlsx" - , package="BioMonTools") - , guess_max = 10^6) - -# Calculate Metrics -# Extra columns to keep in results -keep.cols <- c("Area_mi2", "SurfaceArea", "Density_m2", "Density_ft2") -# Run Function -df.metrics <- metric.values(df.samps.bugs, "bugs", fun.cols2keep = keep.cols) - -# Flags -# Import QC Checks -df.checks <- read_excel(system.file("./extdata/MetricFlags.xlsx" - , package="BioMonTools"), sheet="Flags") -# Run Function -df.flags <- qc.checks(df.metrics, df.checks) - -# Change terminology; PASS/FAIL to NA/flag -df.flags[,"FLAG"][df.flags[,"FLAG"]=="FAIL"] <- "flag" -df.flags[, "FLAG"][df.flags[,"FLAG"]=="PASS"] <- NA -# long to wide format -df.flags.wide <- dcast(df.flags, SAMPLEID ~ CHECKNAME, value.var="FLAG") -# Calc number of "flag"s by row. -df.flags.wide$NumFlags <- rowSums(df.flags.wide=="flag", na.rm=TRUE) -# Rearrange columns -NumCols <- ncol(df.flags.wide) -df.flags.wide <- df.flags.wide[, c(1, NumCols, 2:(NumCols-1))] -# View(df.flags.wide) - -# Summarize Results -kable(table(df.flags[,"CHECKNAME"], df.flags[,"FLAG"], useNA="ifany")) -``` - diff --git a/inst/doc/vignette_BioMonTools.html b/inst/doc/vignette_BioMonTools.html deleted file mode 100644 index 490f7e7c..00000000 --- a/inst/doc/vignette_BioMonTools.html +++ /dev/null @@ -1,1342 +0,0 @@ - - - - - - - - - - - - - - - - -Vignette, BioMonTools - - - - - - - - - - - - - - - - - - - - - -

Vignette, BioMonTools

-

Erik.Leppo@tetratech.com

-

2019-05-08

- - - - -
-

Purpose

-

The BioMonTools package was created to enable users to have a common set of tools for bioassessment and biomonitoring data.

-
-
-

Installation

-

The package is hosted on GitHub (https://github.com/leppott/BioMonTools) and can be installed using the following lines of code. It is necessary to install the devtools package.

- -
-
-

Help

-

After the BioMonTools package has been installed running the following line of code will open the help file with links to all functions.

- -
-
-

Package Functions

-

The suite of functions in the BioMonTools package are presented below.

-
    -
  • metric.values
  • -
  • markExcluded
  • -
  • rarify
  • -
-
-

metric.values

-

Calculate metric values from a data frame with taxa by sample with fully qualified master taxa information. All percent metric results are 0-1.

-
-

Data Preparation

-

There are a number of required fields for the input file. If any fields are missing the user will be prompted as to which are missing and the user can decide whether to continue or quit. If the user continues, the missing fields will be added but will be filled with zero or NA (as appropriate). Any metrics based on the missing fields will not be valid.

-

Required Fields:

-
    -
  • SAMPLEID

    -
      -
    • Unique sample identifier

    • -
    • Valid entries: character or number, must be unique

    • -
  • -
  • TAXAID

    -
      -
    • Unique taxa identifier

    • -
    • Valid entries: character or number, must be unique

    • -
  • -
  • N_TAXA

    -
      -
    • Number of individuals

    • -
    • Valid entries: number

    • -
  • -
  • EXCLUDE

    -
      -
    • Non-unique/non-distinct taxa are excluded from richness metric calculations but are counted in the other metrics. Appendix B of the ‘BCGcalc_README_20180919’ Word document describes the Excluded Taxa Decision Criteria that was used during BCG model calibration.

    • -
    • Valid entries: TRUE or FALSE

    • -
    • Non-unique/non-distinct taxa should be entered as “TRUE”

    • -
  • -
  • NONTARGET

    -
      -
    • Non-target taxa are not part of the intended capture list; e.g., fish, herps, water column taxa. They are excluded from all metric calculations.

    • -
    • Valid entries: TRUE or FALSE.

    • -
    • NonTarget taxa should be entered as “TRUE”

    • -
  • -
  • INDEX_NAME

    -
      -
    • Name of the BCG rules worksheet in the ‘Rules’ file (in the ‘extdata’ folder) that the R code is referencing.

    • -
    • Valid entries for the Puget Lowlands/Willamette Valley model: BCG_PacNW_v1_500ct or BCG_PacNW_v1_300ct.

    • -
  • -
  • SITE_TYPE

    -
      -
    • Select which BCG model to apply: Low (lo) gradient (<1% NHD+ v2 flowline slope) or high (hi) gradient (≥ 1% NHD+ v2 flowline slope).

    • -
    • Valid entries: “hi” or “lo”.

    • -
  • -
  • PHYLUM, SUBPHYLUM, CLASS, ORDER, FAMILY, SUBFAMILY, TRIBE, GENUS

    -
      -
    • Phylogeny

    • -
    • Other phylogenetic rankings (e.g., SubOrder or SuperFamily) can be included but are not used in the current metric calculations.

    • -
    • Valid entries: text

    • -
  • -
  • BCG_Attr

    -
      -
    • BCG attribute assignments (for example, Stamp and Gerritsen 2018).

    • -
    • Valid entries: 1i, 1m, 2, 3, 4, 5, 6; if not available, leave blank or enter ‘NA’.

    • -
  • -
  • FFG, HABIT, LIFE_CYCLE, TOLVAL, THERMAL_INDICATOR

    -
      -
    • FFG

      -
        -
      • Valid values for FFG: CG, CF, PR, SC, SH

      • -
      • Function feeding group entries.

      • -
    • -
    • HABIT

      -
        -
      • Valid values for HABIT: BU, CB, CN, SP, SW

      • -
      • Habit designations.

      • -
    • -
    • LIFE_CYLCE

      -
        -
      • Valid values for LIFE_CYCLE: UNI, SEMI, MULTI

      • -
      • Life cycle designations.

      • -
    • -
    • THERMAL_INDICATOR

      -
        -
      • Valid values for THERMAL_INDICATOR: COLD, COLD_COOL, COOL_WARM, WARM
      • -
    • -
  • -
-

Fields that are optional can be in the output (see examples below).

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Metric Calculation, select metrics
SAMPLEIDAREA_MI2SURFACEAREADENSITY_M2DENSITY_FT2INDEX_NAMEINDEX_REGIONni_totalnt_totalnt_ti_cnt_ti_ccnt_ti_cwnt_ti_wpi_ti_cpi_ti_ccpi_ti_cwpi_ti_wpt_ti_cpt_ti_ccpt_ti_cwpt_ti_w
01103CSR_Bug_2001-08-27_044.084184NANANABCG_PacNW_v1_500ctlo5892701970.000000040.23769120.71307311.8845500.0000003.70370433.33333325.925926
02087REF_Bug_2002-08-22_01.791475NANANABCG_PacNW_v1_500cthi54238221713.136531415.1291515.53505564.0221405.26315855.26315818.4210532.631579
03013CSR_Bug_2003-07-01_09.6137348NANABCG_PacNW_v1_500cthi5071603240.00000002.95858010.25641060.1577910.00000018.75000012.50000025.000000
03053CSR_Bug_2003-08-14_03.0617238NANABCG_PacNW_v1_500cthi57336118633.315881342.75741715.7068069.0750442.77777850.00000016.6666678.333333
03054CSR_Bug_2003-08-18_071.2497418NANABCG_PacNW_v1_500ctlo5581313130.53763446.4516135.37634474.9103947.69230823.0769237.69230823.076923
06012CSR_Bug_2006-09-05_082.3383538NANABCG_PacNW_v1_500cthi545401171141.100917432.84403743.11926618.5321102.50000042.50000027.50000010.000000
- - -
-

markExcluded

-

Takes as an input data frame with Sample ID, Taxa ID, and phlogenetic name fields and returns a similar dataframe with a column for “excluded” taxa (TRUE or FALSE).

-

Excluded taxa are refered to by multiple names; ambiguous, non-distinct, and non-unique. The “excluded” name was chosen so as to be consistent with “non-target” taxa. That is, taxa marked as “TRUE” are treated as undesireables. Excluded taxa are those that are present in a sample when taxa of the same group are present in the same sample are identified finer level. That is, the parent is marked as excluded when child taxa are present in the same sample.

-

The excluded taxa are referenced in the metric values function. These taxa are removed from the taxa richness metrics. This is because these are coarser level taxa.

-

Exceptions is a 2 column data frame of synonyms or other exceptions. Column 1 is the name used in the TaxaID column the input data frame (df_samptax). Column 2 is the name used in the TaxaLevels columns of the input data frame (df_samptax). The phylogenetic columns (TaxaLevels) will be modified from Column 2 of the Exceptions data frame to match Column 1 of the Exceptions data frame. This ensures that the algorithm for markExcluded works properly. The changes will not be stored and the original names provided in the input data frame (df_samptax) will be returned in the final result. The function example below includes a practical case.

-

Taxa Levels are phylogenetic names that are to be checked. They should be listed in order from course (kingdom) to fine (species). Names not appearing in the data will be skipped.

-

The spelling of names must be consistent (including case) for this function to produce the intended output.

-

Returns a data frame of df_samptax with an additional column, ExcludedTaxa.

-
# Packages
-library(readxl)
-library(dplyr)
-#> Warning: package 'dplyr' was built under R version 3.5.2
-#> 
-#> Attaching package: 'dplyr'
-#> The following objects are masked from 'package:stats':
-#> 
-#>     filter, lag
-#> The following objects are masked from 'package:base':
-#> 
-#>     intersect, setdiff, setequal, union
-library(lazyeval)
-library(knitr)
-
-# Data
-df_samps_bugs <- read_excel(system.file("./extdata/Data_Benthos.xlsx"
-                                        , package="BioMonTools")
-                            , guess_max=10^6)
-
-# Variables
-SampID     <- "SampleID"
-TaxaID     <- "TaxaID"
-TaxaCount  <- "N_Taxa"
-Exclude    <- "Exclude_New"
-TaxaLevels <- c("Kingdom"
-                , "Phylum"
-                , "SubPhylum"
-                , "Class"
-                , "SubClass"
-                , "Order"
-                , "SubOrder"
-                , "SuperFamily"
-                , "Family"
-                , "SubFamily"
-                , "Tribe"
-                , "Genus"
-                , "SubGenus"
-                , "Species"
-                , "Variety")
-# Taxa that should be treated as equivalent
-Exceptions <- data.frame("TaxaID"=c("Sphaeriidae"), "PhyloID"=c("Pisidiidae"))
-
-# Filter Data
-# df_samptax <- filter(df_samps_bugs, !!as.name(SampID) == "08BEA3478__2013-08-21_0")
-# df_tst_small <- markExcluded(df_samptax, SampID, TaxaID, TaxaCount, TaxaLevels, Exceptions, Exclude)
-
-# EXAMPLE 1
-df_tst <- markExcluded(df_samps_bugs, SampID="SampleID", TaxaID="TaxaID", TaxaCount = "N_Taxa"
-                       , Exclude="Exclude_New", TaxaLevels=TaxaLevels, Exceptions=Exceptions)
-#> *WARNING*, 3 taxa levels missing from input data frame; 
-#>  KINGDOM, SUBORDER, VARIETY
-#> [1] "Working on item (1/12); PHYLUM"
-#> [1] "Working on item (2/12); SUBPHYLUM"
-#> [1] "Working on item (3/12); CLASS"
-#> [1] "Working on item (4/12); SUBCLASS"
-#> [1] "Working on item (5/12); ORDER"
-#> [1] "Working on item (6/12); SUPERFAMILY"
-#> [1] "Working on item (7/12); FAMILY"
-#> [1] "Working on item (8/12); SUBFAMILY"
-#> [1] "Working on item (9/12); TRIBE"
-#> [1] "Working on item (10/12); GENUS"
-#> [1] "Working on item (11/12); SUBGENUS"
-#> [1] "Working on item (12/12); SPECIES"
-
-# Compare
-df_compare <- dplyr::summarise(dplyr::group_by(df_tst, SampleID)
-                               , Exclude_Import=sum(Exclude)
-                               , Exclude_R=sum(Exclude_New))
-df_compare$Diff <- df_compare$Exclude_Import - df_compare$Exclude_R
-#
-tbl_diff <- table(df_compare$Diff)
-#kable(tbl_diff)
-# sort
-df_compare <- df_compare %>% arrange(desc(Diff))
-
-# Number with issues
-#sum(abs(df_compare$Diff))
-# total samples
-#nrow(df_compare)
-
-# confusion matrix
-tbl_results <- table(df_tst$Exclude, df_tst$Exclude_New, useNA = "ifany")
-#
-# Show differences
-kable(tbl_results, caption="Confusion Matrix")
- - - - - - - - - - - - - - - - - - - - - -
Confusion Matrix
FALSETRUE
FALSE246530
TRUE02350
-
# samples with differences
-samp_diff <- as.data.frame(df_compare[df_compare[,"Diff"]!=0, "SampleID"])
-# results for only those with differences
-df_tst_diff <- df_tst[df_tst[,"SampleID"] %in% samp_diff$SampleID, ]
-# add diff field
-df_tst_diff$Exclude_Diff <- df_tst_diff$Exclude - df_tst_diff$Exclude_New
-
-# Classification Performance Metrics
-class_TP <- tbl_results[2,2] # True Positive
-class_FN <- tbl_results[2,1] # False Negative
-class_FP <- tbl_results[1,2] # False Positive
-class_TN <- tbl_results[1,1] # True Negative
-class_n <- sum(tbl_results)  # total
-#
-# sensitivity (recall); TP / (TP+FN); measure model to ID true positives
-class_sens <- class_TP / (class_TP + class_FN)
-# precision; TP / (TP+FP); accuracy of model positives
-class_prec <- class_TP / (class_TP + class_FP)
-# specifity; TN / (TN + FP); measure model to ID true negatives
-class_spec <- class_TN  / (class_TN + class_FP)
-# overall accuracy; (TP + TN) / all cases; accuracy of all classifications
-class_acc <- (class_TP + class_TN) / class_n
-# F1; 2 * (class_prec*class_sens) / (class_prec+class_sens)
-## balance of precision and recall
-class_F1 <- 2 * (class_prec * class_sens) / (class_prec + class_sens)
-#
-results_names <- c("Sensitivity (Recall)", "Precision", "Specificity", "OVerall Accuracy", "F1")
-results_values <- c(class_sens, class_prec, class_spec, class_acc, class_F1)
-#
-tbl_class <- data.frame(results_names, results_values)
-names(tbl_class) <- c("Performance Metrics", "Percent")
-tbl_class$Percent <- round(tbl_class$Percent *100, 2)
-kable(tbl_class, caption="Classification Performance Metrics")
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Classification Performance Metrics
Performance MetricsPercent
Sensitivity (Recall)100
Precision100
Specificity100
OVerall Accuracy100
F1100
-

The same data with no “exceptions” leaves 8 records misclassified.

-
# Packages
-library(readxl)
-library(dplyr)
-library(lazyeval)
-library(knitr)
-
-# Data
-df_samps_bugs <- read_excel(system.file("./extdata/Data_Benthos.xlsx"
-                                        , package="BioMonTools")
-                            , guess_max=10^6)
-
-# Variables
-SampID     <- "SampleID"
-TaxaID     <- "TaxaID"
-TaxaCount  <- "N_Taxa"
-Exclude    <- "Exclude_New"
-TaxaLevels <- c("Kingdom"
-                , "Phylum"
-                , "SubPhylum"
-                , "Class"
-                , "SubClass"
-                , "Order"
-                , "SubOrder"
-                , "SuperFamily"
-                , "Family"
-                , "SubFamily"
-                , "Tribe"
-                , "Genus"
-                , "SubGenus"
-                , "Species"
-                , "Variety")
-# Taxa that should be treated as equivalent
-Exceptions <- NA
-
-# EXAMPLE 2
-## No Exceptions
-
-df_tst2 <- markExcluded(df_samps_bugs, SampID="SampleID", TaxaID="TaxaID", TaxaCount = "N_Taxa"
-                        , Exclude="Exclude_New", TaxaLevels=TaxaLevels, Exceptions=NA)
-#> *WARNING*, 3 taxa levels missing from input data frame; 
-#>  KINGDOM, SUBORDER, VARIETY
-#> [1] "Working on item (1/12); PHYLUM"
-#> [1] "Working on item (2/12); SUBPHYLUM"
-#> [1] "Working on item (3/12); CLASS"
-#> [1] "Working on item (4/12); SUBCLASS"
-#> [1] "Working on item (5/12); ORDER"
-#> [1] "Working on item (6/12); SUPERFAMILY"
-#> [1] "Working on item (7/12); FAMILY"
-#> [1] "Working on item (8/12); SUBFAMILY"
-#> [1] "Working on item (9/12); TRIBE"
-#> [1] "Working on item (10/12); GENUS"
-#> [1] "Working on item (11/12); SUBGENUS"
-#> [1] "Working on item (12/12); SPECIES"
-
-# Compare
-df_compare2 <- dplyr::summarise(dplyr::group_by(df_tst2, SampleID)
-                               , Exclude_Import=sum(Exclude)
-                               , Exclude_R=sum(Exclude_New))
-df_compare2$Diff <- df_compare2$Exclude_Import - df_compare2$Exclude_R
-#
-tbl_diff2 <- table(df_compare2$Diff)
-#kable(tbl_diff2)
-# sort
-df_compare2 <- df_compare2 %>% arrange(desc(Diff))
-
-# Number with issues
-#sum(abs(df_compare2$Diff))
-# total samples
-#nrow(df_compare2)
-
-# confusion matrix
-tbl_results2 <- table(df_tst2$Exclude, df_tst2$Exclude_New, useNA = "ifany")
-#
-# Show differences
-kable(tbl_results2, caption="Confusion Matrix")
- - - - - - - - - - - - - - - - - - - - - -
Confusion Matrix
FALSETRUE
FALSE246530
TRUE82342
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
SampleIDExclude_ImportExclude_RDiff
08BEA3478__2013-08-21_0321
08BEA3571__2014-09-03_0541
08LIT2692__2012-09-10_0871
08SAM0000__2012-07-11_0431
08SAM0000__2013-07-25_0431
09BLA0716__2014-08-14_0321
95C__2012-10-02_0101
95T__2012-10-03_0101
01103CSR_Bug_2001-08-27_0110
02087REF_Bug_2002-08-22_0000
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
SampleIDExclude_ImportExclude_RDiff
WOODS298__2010-08-09_0770
WOODS298__2013-09-03_0770
Woods446__2010-08-19_0660
Woodscres__2010-08-05_011110
woodshand__2010-08-06_012120
woodshand__2013-09-03_0440
-
# samples with differences
-(samp_diff2 <- as.data.frame(df_compare2[df_compare2[,"Diff"]!=0, "SampleID"]))
-#>                  SampleID
-#> 1 08BEA3478__2013-08-21_0
-#> 2 08BEA3571__2014-09-03_0
-#> 3 08LIT2692__2012-09-10_0
-#> 4 08SAM0000__2012-07-11_0
-#> 5 08SAM0000__2013-07-25_0
-#> 6 09BLA0716__2014-08-14_0
-#> 7       95C__2012-10-02_0
-#> 8       95T__2012-10-03_0
-# results for only those with differences
-df_tst_diff2 <- filter(df_tst2, SampleID %in% samp_diff2$SampleID)
-# add diff field
-df_tst_diff2$Exclude_Diff <- df_tst_diff2$Exclude - df_tst_diff2$Exclude_New
-
-# Classification Performance Metrics
-class_TP2 <- tbl_results2[2,2] # True Positive
-class_FN2 <- tbl_results2[2,1] # False Negative
-class_FP2 <- tbl_results2[1,2] # False Positive
-class_TN2 <- tbl_results2[1,1] # True Negative
-class_n2 <- sum(tbl_results2)  # total
-#
-# sensitivity (recall); TP / (TP+FN); measure model to ID true positives
-class_sens2 <- class_TP2 / (class_TP2 + class_FN2)
-# precision; TP / (TP+FP); accuracy of model positives
-class_prec2 <- class_TP2 / (class_TP2 + class_FP2)
-# specifity; TN / (TN + FP); measure model to ID true negatives
-class_spec2 <- class_TN2 / (class_TN2 + class_FP2)
-# overall accuracy; (TP + TN) / all cases; accuracy of all classifications
-class_acc2 <- (class_TP2 + class_TN2) / class_n2
-# F1; 2 * (class_prec*class_sens) / (class_prec+class_sens)
-## balance of precision and recall
-class_F12 <- 2 * (class_prec2 * class_sens2) / (class_prec2 + class_sens2)
-#
-results_names2 <- c("Sensitivity (Recall)", "Precision", "Specificity", "OVerall Accuracy", "F1")
-results_values2 <- c(class_sens2, class_prec2, class_spec2, class_acc2, class_F12)
-#
-tbl_class2 <- data.frame(results_names2, results_values2)
-names(tbl_class2) <- c("Performance Metrics", "Percent")
-tbl_class2$Percent <- round(tbl_class2$Percent *100, 2)
-kable(tbl_class2, caption="Classification Performance Metrics")
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Classification Performance Metrics
Performance MetricsPercent
Sensitivity (Recall)99.66
Precision100.00
Specificity100.00
OVerall Accuracy99.97
F199.83
-
-
-

rarify

-

The rarify function subsamples count data to a fixed count per sample. It takes as an input a 3 column data frame (SampleID, TaxonID, Count) and returns a similar dataframe with revised Counts. The names of the columns does not matter as they are specified in the code. Any non-count taxa (e.g., fish in a bug sample) should be removed prior to using the rarify function. The function code is from USEPA Corvallis John Van Sickle’s R code for RIVPACS (v1.0, 2005-06-10) and was tweaked for the addition of a user provided seed so repeatable results can be obtained.

-

The other function inputs are subsample size (target number of organisms in each sample) and seed. The seed is given so the results can be reproduced from the same input file. If no seed is given a random seed is used. An example seed is the date of admission to the Union for each state where the data is collected (e.g., Washington is 18891111). These values can be found on Wikipedia on the right sidebar for each State.

-

If you are running the 500-count BCG model and any of your samples have more than 600 organisms (the upper limit for the model), you should randomly subsample your data to 600 (600 is +20% of the 500-count target). This is done to make richness metrics comparable across the 500-count samples. You can do this with the Rarify routine.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Comparison, by Sample
SampleIDTaxaIDN_Taxa_OrigN_Taxa_500
01103CSR_Bug_2001-08-27_0Ceratopogoninae237142
01103CSR_Bug_2001-08-27_0Cheumatopsyche20
01103CSR_Bug_2001-08-27_0Chironomini84
01103CSR_Bug_2001-08-27_0Cladocera21
01103CSR_Bug_2001-08-27_0Coenagrionidae21
01103CSR_Bug_2001-08-27_0Corbicula21
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Comparison, sample totals
SampleIDN_Taxa_OrigN_Taxa_500
01103CSR_Bug_2001-08-27_0816500
02087REF_Bug_2002-08-22_0542500
03013CSR_Bug_2003-07-01_0508500
03053CSR_Bug_2003-08-14_0573500
03054CSR_Bug_2003-08-18_0558500
06012CSR_Bug_2006-09-05_0545500
- -
-

Flags

-

Results should be interpreted with caution if they are flagged for any of the criteria listed below. It is up to the user’s discretion as to how to handled flagged samples.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
flagNA
brackish organisms present7671
catchment, Large0678
catchment, small158520
individuals, dominant 02, Large204474
individuals, Large0678
individuals, small80598
Low density (ft2)0678
Low density (m2)0678
Ramellogammarus8670
surface area, small112566
-
-
- - - - - - - - - diff --git a/inst/doc/vignette_MapTaxaObs.R b/inst/doc/vignette_MapTaxaObs.R deleted file mode 100644 index 43b19767..00000000 --- a/inst/doc/vignette_MapTaxaObs.R +++ /dev/null @@ -1,84 +0,0 @@ -## ----rmd_setup, include = FALSE------------------------------------------ -knitr::opts_chunk$set( - collapse = TRUE, - comment = "#>" -) - -## ----data, echo=FALSE---------------------------------------------------- -# Packages -library(BioMonTools) -library(knitr) -# Data -df_obs <- data_Taxa_MA -# Show -kable(head(df_obs)) - -## ----Ex_gg, fig.width = 6------------------------------------------------ -# Packages -library(BioMonTools) -library(ggplot2) -library(knitr) - -# -df_obs <- data_Taxa_MA - -TaxaID <- "TaxaName" -TaxaCount <- "Count" -Lat <- "Latitude" -Long <- "Longitude" - - - - -myTaxa <- "ALEWIFE, ADULTS, 0.5-25 ppt" - -df_map <- subset(df_obs, df_obs[,TaxaID]==myTaxa) - -myDB <- "state" -myRegion <- "massachusetts" - -Lat <- "Latitude" -Long <- "Longitude" - - - - -# Base Map -m1 <- ggplot(data=subset(map_data(myDB), region %in% c(myRegion))) + - geom_polygon(aes(x=long, y=lat, group=group), fill="light gray", color="black") + - coord_fixed(1.3) + theme_void() -# Add points (all) -m1 <- m1 + geom_point(data=df_obs, aes(df_obs[,Long], df_obs[,Lat]), fill=NA, color="gray") -# Add points (Taxa) -m1 <- m1 + geom_point(data=df_map, aes(df_map[,Long], df_map[,Lat]), color="blue") -# Map Title (center) -m1 <- m1 + labs(title=myTaxa) + theme(plot.title = element_text(hjust = 0.5)) -# Caption (left justified) -m1 <- m1 + labs(caption="caption1 \n caption2") + theme(plot.caption = element_text(hjust=0)) - -# Show Results -kable(head(df_obs)) -m1 - -## ----Ex_PDF, eval=FALSE-------------------------------------------------- -# df_obs <- data_Taxa_MA -# SampID <- "estuary" -# TaxaID <- "TaxaName" -# TaxaCount <- "Count" -# Lat <- "Latitude" -# Long <- "Longitude" -# output_dir <- getwd() -# output_prefix <- "maps.taxa." -# output_type <- "pdf" -# -# myDB <- "state" -# myRegion <- "massachusetts" -# myXlim <- c(-(73+(30/60)), -(69+(56/60))) -# myYlim <- c((41+(14/60)),(42+(53/60))) -# -# # Run function with extra arguments for map -# MapTaxaObs(df_obs, SampID, TaxaID, TaxaCount, Lat, Long -# , output_dir, output_prefix, output_type -# , database="state", regions="massachusetts", xlim=myXlim, ylim=myYlim) -# - diff --git a/inst/doc/vignette_MapTaxaObs.Rmd b/inst/doc/vignette_MapTaxaObs.Rmd deleted file mode 100644 index b9bce8c2..00000000 --- a/inst/doc/vignette_MapTaxaObs.Rmd +++ /dev/null @@ -1,117 +0,0 @@ ---- -title: "Vignette, Taxa Maps" -author: "Erik.Leppo@tetratech.com" -date: "`r Sys.Date()`" -output: rmarkdown::html_vignette -vignette: > - %\VignetteIndexEntry{Taxa Maps} - %\VignetteEngine{knitr::rmarkdown} - %\VignetteEncoding{UTF-8} ---- - -```{r rmd_setup, include = FALSE} -knitr::opts_chunk$set( - collapse = TRUE, - comment = "#>" -) -``` -# Purpose -To create taxa distribution maps. - -# Usage -Map taxonomic observations from a data frame. Input a dataframe with SampID, TaxaID, TaxaCount, Latitude, and Longitude. Other arguments are format (jpg vs. pdf), file name prefix, and output directory. Files are saved with the prefix "map.taxa." by default. - -Uses the `maps` package map function. - -For maps package map function need database (usa, state, county) and regions (e.g., maryland). Additional map function arguments can be passed through the MapTaxaObs function. - -# Example, Data -Data used should have Sample Identifier, Taxa Identifier, Taxa Count (can be 1 for all), Latitude/Longitude (decimal degrees). - -```{r data, echo=FALSE} -# Packages -library(BioMonTools) -library(knitr) -# Data -df_obs <- data_Taxa_MA -# Show -kable(head(df_obs)) -``` - -# Example, ggplot -The `ggplot2` package can be used to create single maps that are returned to the console for further editing. - -```{r Ex_gg, fig.width = 6} -# Packages -library(BioMonTools) -library(ggplot2) -library(knitr) - -# -df_obs <- data_Taxa_MA - -TaxaID <- "TaxaName" -TaxaCount <- "Count" -Lat <- "Latitude" -Long <- "Longitude" - - - - -myTaxa <- "ALEWIFE, ADULTS, 0.5-25 ppt" - -df_map <- subset(df_obs, df_obs[,TaxaID]==myTaxa) - -myDB <- "state" -myRegion <- "massachusetts" - -Lat <- "Latitude" -Long <- "Longitude" - - - - -# Base Map -m1 <- ggplot(data=subset(map_data(myDB), region %in% c(myRegion))) + - geom_polygon(aes(x=long, y=lat, group=group), fill="light gray", color="black") + - coord_fixed(1.3) + theme_void() -# Add points (all) -m1 <- m1 + geom_point(data=df_obs, aes(df_obs[,Long], df_obs[,Lat]), fill=NA, color="gray") -# Add points (Taxa) -m1 <- m1 + geom_point(data=df_map, aes(df_map[,Long], df_map[,Lat]), color="blue") -# Map Title (center) -m1 <- m1 + labs(title=myTaxa) + theme(plot.title = element_text(hjust = 0.5)) -# Caption (left justified) -m1 <- m1 + labs(caption="caption1 \n caption2") + theme(plot.caption = element_text(hjust=0)) - -# Show Results -kable(head(df_obs)) -m1 -``` - - -# Example, PDF -The example below will create a PDF with one map per page. -```{r Ex_PDF, eval=FALSE} -df_obs <- data_Taxa_MA -SampID <- "estuary" -TaxaID <- "TaxaName" -TaxaCount <- "Count" -Lat <- "Latitude" -Long <- "Longitude" -output_dir <- getwd() -output_prefix <- "maps.taxa." -output_type <- "pdf" - -myDB <- "state" -myRegion <- "massachusetts" -myXlim <- c(-(73+(30/60)), -(69+(56/60))) -myYlim <- c((41+(14/60)),(42+(53/60))) - -# Run function with extra arguments for map -MapTaxaObs(df_obs, SampID, TaxaID, TaxaCount, Lat, Long - , output_dir, output_prefix, output_type - , database="state", regions="massachusetts", xlim=myXlim, ylim=myYlim) - -``` - diff --git a/inst/doc/vignette_MapTaxaObs.html b/inst/doc/vignette_MapTaxaObs.html deleted file mode 100644 index b567ce27..00000000 --- a/inst/doc/vignette_MapTaxaObs.html +++ /dev/null @@ -1,665 +0,0 @@ - - - - - - - - - - - - - - - - -Vignette, Taxa Maps - - - - - - - - - - - - - - - - - - - - - -

Vignette, Taxa Maps

-

Erik.Leppo@tetratech.com

-

2019-05-08

- - - - -
-

Purpose

-

To create taxa distribution maps.

-
-
-

Usage

-

Map taxonomic observations from a data frame. Input a dataframe with SampID, TaxaID, TaxaCount, Latitude, and Longitude. Other arguments are format (jpg vs. pdf), file name prefix, and output directory. Files are saved with the prefix “map.taxa.” by default.

-

Uses the maps package map function.

-

For maps package map function need database (usa, state, county) and regions (e.g., maryland). Additional map function arguments can be passed through the MapTaxaObs function.

-
-
-

Example, Data

-

Data used should have Sample Identifier, Taxa Identifier, Taxa Count (can be 1 for all), Latitude/Longitude (decimal degrees).

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
estuaryCommonNameLifeStageSalZoneWinterSpringSummerFallAllTaxaNameStateLatitudeLongitudeCountPctDensity
BOSTON HARBORALEWIFEADULTS0.5-25 ppt0.00000002.3333333.33333331.3333331.7500000ALEWIFE, ADULTS, 0.5-25 pptMA42.335-70.98151.75000000.0023913
BOSTON HARBORALEWIFEADULTS>25 ppt0.00000002.3333333.33333332.6666672.0833333ALEWIFE, ADULTS, >25 pptMA42.335-70.98152.08333330.0028467
BOSTON HARBORAMERICAN EELADULTS0.5-25 ppt0.00000000.0000000.66666672.6666670.8333333AMERICAN EEL, ADULTS, 0.5-25 pptMA42.335-70.98150.83333330.0011387
BOSTON HARBORAMERICAN EELADULTS>25 ppt0.00000000.0000000.66666672.6666670.8333333AMERICAN EEL, ADULTS, >25 pptMA42.335-70.98150.83333330.0011387
BOSTON HARBORAMERICAN LOBSTERADULTS0.5-25 ppt0.66666672.3333334.00000003.3333332.5833333AMERICAN LOBSTER, ADULTS, 0.5-25 pptMA42.335-70.98152.58333330.0035299
BOSTON HARBORAMERICAN LOBSTERADULTS>25 ppt2.33333333.0000004.00000003.3333333.1666667AMERICAN LOBSTER, ADULTS, >25 pptMA42.335-70.98153.16666670.0043270
-
-
-

Example, ggplot

-

The ggplot2 package can be used to create single maps that are returned to the console for further editing.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
estuaryCommonNameLifeStageSalZoneWinterSpringSummerFallAllTaxaNameStateLatitudeLongitudeCountPctDensity
BOSTON HARBORALEWIFEADULTS0.5-25 ppt0.00000002.3333333.33333331.3333331.7500000ALEWIFE, ADULTS, 0.5-25 pptMA42.335-70.98151.75000000.0023913
BOSTON HARBORALEWIFEADULTS>25 ppt0.00000002.3333333.33333332.6666672.0833333ALEWIFE, ADULTS, >25 pptMA42.335-70.98152.08333330.0028467
BOSTON HARBORAMERICAN EELADULTS0.5-25 ppt0.00000000.0000000.66666672.6666670.8333333AMERICAN EEL, ADULTS, 0.5-25 pptMA42.335-70.98150.83333330.0011387
BOSTON HARBORAMERICAN EELADULTS>25 ppt0.00000000.0000000.66666672.6666670.8333333AMERICAN EEL, ADULTS, >25 pptMA42.335-70.98150.83333330.0011387
BOSTON HARBORAMERICAN LOBSTERADULTS0.5-25 ppt0.66666672.3333334.00000003.3333332.5833333AMERICAN LOBSTER, ADULTS, 0.5-25 pptMA42.335-70.98152.58333330.0035299
BOSTON HARBORAMERICAN LOBSTERADULTS>25 ppt2.33333333.0000004.00000003.3333333.1666667AMERICAN LOBSTER, ADULTS, >25 pptMA42.335-70.98153.16666670.0043270
- -

-
- - - - - - - - - diff --git a/inst/extdata/BioMonTools_LibraryCreation.Rmd b/inst/extdata/BioMonTools_LibraryCreation.Rmd index 59e313d6..14afdc6d 100644 --- a/inst/extdata/BioMonTools_LibraryCreation.Rmd +++ b/inst/extdata/BioMonTools_LibraryCreation.Rmd @@ -70,7 +70,7 @@ setwd(paste0("./",myPkg)) # will fail as already in this directory devtools::document() ## Install New Package (locally) setwd("..") # return to root directory first -devtools::install(myPkg) +devtools::install(myPkg, quick=FALSE, reload=TRUE, build_vignettes = TRUE) ## Reload library library(myPkg, character.only = TRUE) # change wd back to package diff --git a/inst/extdata/BioMonTools_LibraryCreation.nb.html b/inst/extdata/BioMonTools_LibraryCreation.nb.html index 33660a4e..834d0a91 100644 --- a/inst/extdata/BioMonTools_LibraryCreation.nb.html +++ b/inst/extdata/BioMonTools_LibraryCreation.nb.html @@ -75,7 +75,7 @@ padding: 0 4px 0 4px; } .pagedtable .even { -background-color: #fcfcfc; +background-color: rgba(140, 140, 140, 0.1); } .pagedtable-padding-col { display: none; @@ -1479,7 +1479,7 @@ var currentIndex = 1; // select all R code blocks - var rCodeBlocks = $('pre.r, pre.python, pre.bash, pre.sql, pre.cpp, pre.stan'); + var rCodeBlocks = $('pre.r, pre.python, pre.bash, pre.sql, pre.cpp, pre.stan, pre.julia'); rCodeBlocks.each(function() { // create a collapsable div to wrap the code in @@ -1600,9 +1600,7 @@ - - -
- + + + @@ -1678,6 +1738,14 @@ + + + + + +
+ + @@ -1755,7 +1823,7 @@

Create Package

Use the code below to create the package. Assumes you are in the development package directory

- +
# Library Name
 # NEWS
 # Render then Copy NEWS so picked up in help
@@ -1779,7 +1847,7 @@ 

Create Package

devtools::document() ## Install New Package (locally) setwd("..") # return to root directory first -devtools::install(myPkg) +devtools::install(myPkg, quick=FALSE, reload=TRUE, build_vignettes = TRUE) ## Reload library library(myPkg, character.only = TRUE) # change wd back to package @@ -1890,7 +1958,7 @@

Other Stuff

-
LS0tDQp0aXRsZTogIkxpYnJhcnkgQ3JlYXRpb24iDQpzdWJ0aXRsZTogIkJpb01vblRvb2xzIg0KYXV0aG9yOiAiRXJpay5MZXBwb0B0ZXRyYXRlY2guY29tIg0KZGF0ZTogImByIFN5cy50aW1lKClgIg0Kb3V0cHV0OiANCiAgaHRtbF9ub3RlYm9vazoNCiAgICB0b2M6IHllcw0KICAgIGRlcHRoOiAzDQogICAgdG9jX2Zsb2F0OiBubw0KLS0tDQoNCkhlbHBlciBjb2RlIGZvciBjcmVhdGluZyBsaWJyYXJ5Lg0KDQpFcmlrLkxlcHBvQHRldHJhdGVjaC5jb20NCjIwMTctMDktMjYNCg0KIyBQYWNrYWdlDQoNClBhY2thZ2UgcmVsYXRlZCBjb2RlLg0KDQojIyBWaWduZXR0ZQ0KDQoxLiBOZWVkIHRvIHJ1biBjb2RlIGJlbG93IHRvIGFkZCBkYXRhIHRvICJ2aWduZXR0ZSIgZGlyZWN0b3J5IHNvIGl0IHdpbGwgd29yay4NCg0KYGBge3IgVmlnbmV0dGVfRGF0YSwgZXZhbD1GQUxTRX0NCg0KYGBgDQoNCjIuIEtuaXQgdGhlIHZpZ25ldHRlIGluIHRoZSB2aWduZXR0ZSBmb2xkZXIgdG8gZW5zdXJlIGFsbCBvZiB0aGUgY29kZSB3b3JrcyBhbmQgDQppcyBwcm9wZXJseSBkaXNwbGF5ZWQuICBUaGlzIGNhbiB0YWtlIDIgdG8gNSBtaW4uDQoNCjMuIFVzZSB0aGUgY29kZSBiZWxvdyB0byAiYnVpbGQiIHRoZSB2aWduZXR0ZSBhbmQgdGhlbiB1c2UgaXQgaW4gdGhlIHBrZy4NCg0KYGBge3IgVmlnbmV0dGVfQnVpbGQsIGV2YWw9RkFMU0V9DQojIGdlbmVyYXRlIFZpZ25ldHRlDQpsaWJyYXJ5KEJpb01vblRvb2xzKQ0KbGlicmFyeShkZXZ0b29scykNCmRldnRvb2xzOjpidWlsZF92aWduZXR0ZXMoKQ0KDQojIGNyZWF0ZSB2aWduZXR0ZSBmb2xkZXIgYW5kIGRlZmF1bHQgZmlsZQ0KI2RldnRvb2xzOjp1c2VfdmlnbmV0dGUoIkJDR2NhbGNfVmlnbmV0dGUiKQ0KYGBgDQpkZXZ0b29sczo6YnVpbGQoKSBtb3JlIHVzZWZ1bCBhbmQgYnVpbGRfdmlnbmV0dGVzKCkNCg0KIyMgQ3JlYXRlIFBhY2thZ2UNClVzZSB0aGUgY29kZSBiZWxvdyB0byBjcmVhdGUgdGhlIHBhY2thZ2UuICBBc3N1bWVzIHlvdSBhcmUgaW4gdGhlIGRldmVsb3BtZW50IHBhY2thZ2UgZGlyZWN0b3J5DQoNCmBgYHtyLCBldmFsPUZBTFNFfQ0KIyBMaWJyYXJ5IE5hbWUNCiMgTkVXUw0KIyBSZW5kZXIgdGhlbiBDb3B5IE5FV1Mgc28gcGlja2VkIHVwIGluIGhlbHANCnJtYXJrZG93bjo6cmVuZGVyKCJORVdTLnJtZCIsICJhbGwiKQ0KZmlsZS5jb3B5KCJORVdTLm1kIiwgIk5FV1MiLCBvdmVyd3JpdGUgPSBUUlVFKQ0KZmlsZS5yZW1vdmUoIk5FV1MuaHRtbCIpDQpmaWxlLnJlbW92ZSgiTkVXUy5tZCIpDQojDQpteVBrZyA8LSAiQmlvTW9uVG9vbHMiDQojIExvYWQgTGlicmFyeQ0KbGlicmFyeShkZXZ0b29scykNCiN+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+DQojIENyZWF0ZSBQYWNrYWdlDQojIGNyZWF0ZShteVBrZykNCiN+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+DQojDQojfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fg0KIyBEb2N1bWVudCwgSW5zdGFsbCwgYW5kIFJlbG9hZCBMaWJyYXJ5DQojIyBHZW5lcmF0ZSBEb2N1bWVudGF0aW9uDQpzZXR3ZChwYXN0ZTAoIi4vIixteVBrZykpICAjIHdpbGwgZmFpbCBhcyBhbHJlYWR5IGluIHRoaXMgZGlyZWN0b3J5DQpkZXZ0b29sczo6ZG9jdW1lbnQoKQ0KIyMgSW5zdGFsbCBOZXcgUGFja2FnZSAobG9jYWxseSkNCnNldHdkKCIuLiIpICMgcmV0dXJuIHRvIHJvb3QgZGlyZWN0b3J5IGZpcnN0DQpkZXZ0b29sczo6aW5zdGFsbChteVBrZykNCiMjIFJlbG9hZCBsaWJyYXJ5DQpsaWJyYXJ5KG15UGtnLCBjaGFyYWN0ZXIub25seSA9IFRSVUUpDQojIGNoYW5nZSB3ZCBiYWNrIHRvIHBhY2thZ2UNCnNldHdkKHBhc3RlMCgiLi8iLG15UGtnKSkNCiN+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+DQpgYGANCg0KQWZ0ZXIgY3JlYXRpbmcgdGhlIHBhY2thZ2UgcmVsb2FkIGl0IGFmdGVyIHJlc3RhcnRpbmcgUiB3aXRoaW4gUlN0dWRpbyAoQ3RybCArIFNoaWZ0ICsgRjEwKS4NCg0KYGBge3IsIGV2YWw9RkFMU0V9DQojIFJlc3RhcnQgUiB3aXRoaW4gUlN0dWRpbzogIEN0cmwgKyBTaGlmdCArIEYxMA0KbXlQa2cgPC0gIkJpb01vblRvb2xzIg0KbGlicmFyeShteVBrZywgY2hhcmFjdGVyLm9ubHkgPSBUUlVFKQ0KaGVscChwYWNrYWdlPShteVBrZykpDQojDQpjaXRhdGlvbihteVBrZykNCmBgYA0KDQojIyMgUnVuIEFsbCBFeGFtcGxlcw0KUnVuIGFsbCBleGFtcGxlcyBhdCBvbmNlIHJhdGhlciB0aGFuIGdvaW5nIHRvIGVhY2ggZnVuY3Rpb24gaW5kaXZpZHVhbGx5Lg0KDQpBZGQgIi9fdGVzdCIgdG8gZ2l0aWdub3JlDQoNCihOZWVkcyB0d2Vha2luZyB0byBnZXQgaXQgd29ya2luZyBwcm9wZXJseSkNCg0KYGBge3IgQWxsRXhhbXBsZXMsIGV2YWw9RkFMU0V9DQpwa2cgPC0gIkJDR2NhbGMiDQpzZXR3ZCgiLi9fdGVzdCIpDQpkZXZ0b29sczo6cnVuX2V4YW1wbGVzKHBrZz1wa2cpDQpgYGANCg0KDQojIyBJbmNsdWRpbmcgRGF0YQ0KQWxsIGRhdGEgc2hvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIGNyZWF0ZWQuDQoNCiMjIENoZWNrDQoNCmBgYHtyLCBldmFsPUZBTFNFfQ0KIyBDaGVjayBmb3IgZXJyb3JzIChvciBwcmVzcyBDbWQgKyBTaGlmdCArIEUgaW4gUlN0dWRpbykNCiNodHRwOi8vci1wa2dzLmhhZC5jby5uei9jaGVjay5odG1sDQpkZXZ0b29sczo6Y2hlY2soKQ0KYGBgDQoNCklmIHVzZSBSU3R1ZGlvLCBCdWlsZCAtIENoZWNrIFBhY2thZ2UsIHRoZSBvdXRwdXQgaXMgZWFzaWVyIHRvIHJlYWQuIA0KDQoNCiMjIFRlc3QNCk5lZWQgdG8gdXNlIHRlc3R0aGF0IGJ1dCBub3QgdG8gdGhhdCBzdGFnZSB5ZXQuDQoNClJTdHVkaW8sIEJ1aWxkIC0gVGVzdCBQYWNrYWdlLg0KDQoNCiMgT3RoZXIgU3R1ZmYNCg0KYGBge3IsIGV2YWw9RkFMU0V9DQojfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fg0KIyBVcGxvYWQgdG8gR2l0aHViIHZpYSBHaXRIdWIgRGVza3RvcCB1dGlsaXR5DQojIDAuIGRvd25sb2FkIGZyb20gd2ViIHZpYSAiY2xvbmUgb3IgZG93bmxvYWQiIHZpYSAiT3BlbiBpbiBEZXNrdG9wIiAoR2l0SHViIERlc2t0b3ApIGlmIG5vdCBhbHJlYWR5IGluIEdpdEh1YiBEZXNrdG9wDQojIDEuIE1ha2UgY2hhbmdlcyBpbiBkb3dubG9hZC9jbG9uZSBmb2xkZXIuIChkb25lIGFib3ZlKQ0KIyAzLiBPcGVuIEdIIERlc2t0b3AgY29tbWl0IGNoYW5nZXMgdGhlbiBzeW5jLg0KI35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4NCiMgaW5zdGFsbCBmcm9tIEdpdEh1YiAodmlhIGRldnRvb2xzKQ0KZGV2dG9vbHM6Omluc3RhbGxfZ2l0aHViKHBhc3RlMCgibGVwcG90dC8iLG15TGlicmFyeSkpDQojDQoNCg0KDQojfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fg0KIyByZW1vdmUgaW5zdGFsbGVkIHBhY2thZ2VzIChpZiBuZWVkZWQgZm9yIHRyb3VibGVzaG9vdGluZykNCnNlYXJjaCgpICMgZmluZA0KI2RldGFjaCgzKSAjIHJlbW92ZSBieSBudW1iZXINCiN+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+DQoNCg0KIyB0byBidWlsZCBwYWNrYWdlDQojaHR0cHM6Ly90aGVwb2xpdGljYWxtZXRob2RvbG9naXN0LmNvbS8yMDE0LzA4LzE0L2J1aWxkaW5nLWFuZC1tYWludGFpbmluZy1yLXBhY2thZ2VzLXdpdGgtZGV2dG9vbHMtYW5kLXJveHlnZW4yLw0KIyBUbyBidWlsZCB0aGUgcGFja2FnZSBhcyBhIGNvbXByZXNzZWQgZmlsZSBpbiB5b3VyIHdvcmtpbmcgZGlyZWN0b3J5LCBydW4gYnVpbGQoY3VycmVudC5jb2RlLCBwYXRoPWdldHdkKCkpLg0KDQojIHRvIHNhdmUgaW50ZXJuYWwgZGF0YSBmb3IgZXhhbXBsZXMNCiMgZXhhbXBsZQ0KI2h0dHA6Ly9yLXBrZ3MuaGFkLmNvLm56L2RhdGEuaHRtbCNkYXRhLXN5c2RhdGENCiMgaGF2ZSB0byBiZSBhdCByb290IGRpcmVjdG9yeSAoYWJvdmUgcGFja2FnZSkNCiNkZXZ0b29sczo6dXNlX2RhdGEoTlYucHJlZGljdG9ycyxOVi5idWdzLHBrZz0iTU1JY2FsY05WIixpbnRlcm5hbD1UUlVFLG92ZXJ3cml0ZT1UUlVFKQ0KIyMgdmVyaWZ5IHdpdGggZGF0YSgpDQoNCiMgVG8gc2F2ZSBSTUQgZmlsZXMNCiMgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zMDM3NzIxMy9ob3ctdG8taW5jbHVkZS1ybWFya2Rvd24tZmlsZS1pbi1yLXBhY2thZ2UNCiMgL3BrZy9pbnN0L3JtZC8NCiMgc3lzdGVtLmZpbGUoInJtZC9maWxlLlJtZCIsIHBhY2thZ2U9InBhY2thZ2VuYW1lIikNCiMNCiN+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+DQojaHR0cHM6Ly9oaWxhcnlwYXJrZXIuY29tLzIwMTQvMDQvMjkvd3JpdGluZy1hbi1yLXBhY2thZ2UtZnJvbS1zY3JhdGNoLw0KIyBDcmVhdGUgUGFja2FnZQ0KIyBjcmVhdGUobXlMaWJyYXJ5KQ0KDQpgYGANCg0KDQo=
+
LS0tDQp0aXRsZTogIkxpYnJhcnkgQ3JlYXRpb24iDQpzdWJ0aXRsZTogIkJpb01vblRvb2xzIg0KYXV0aG9yOiAiRXJpay5MZXBwb0B0ZXRyYXRlY2guY29tIg0KZGF0ZTogImByIFN5cy50aW1lKClgIg0Kb3V0cHV0OiANCiAgaHRtbF9ub3RlYm9vazoNCiAgICB0b2M6IHllcw0KICAgIGRlcHRoOiAzDQogICAgdG9jX2Zsb2F0OiBubw0KLS0tDQoNCkhlbHBlciBjb2RlIGZvciBjcmVhdGluZyBsaWJyYXJ5Lg0KDQpFcmlrLkxlcHBvQHRldHJhdGVjaC5jb20NCjIwMTctMDktMjYNCg0KIyBQYWNrYWdlDQoNClBhY2thZ2UgcmVsYXRlZCBjb2RlLg0KDQojIyBWaWduZXR0ZQ0KDQoxLiBOZWVkIHRvIHJ1biBjb2RlIGJlbG93IHRvIGFkZCBkYXRhIHRvICJ2aWduZXR0ZSIgZGlyZWN0b3J5IHNvIGl0IHdpbGwgd29yay4NCg0KYGBge3IgVmlnbmV0dGVfRGF0YSwgZXZhbD1GQUxTRX0NCg0KYGBgDQoNCjIuIEtuaXQgdGhlIHZpZ25ldHRlIGluIHRoZSB2aWduZXR0ZSBmb2xkZXIgdG8gZW5zdXJlIGFsbCBvZiB0aGUgY29kZSB3b3JrcyBhbmQgDQppcyBwcm9wZXJseSBkaXNwbGF5ZWQuICBUaGlzIGNhbiB0YWtlIDIgdG8gNSBtaW4uDQoNCjMuIFVzZSB0aGUgY29kZSBiZWxvdyB0byAiYnVpbGQiIHRoZSB2aWduZXR0ZSBhbmQgdGhlbiB1c2UgaXQgaW4gdGhlIHBrZy4NCg0KYGBge3IgVmlnbmV0dGVfQnVpbGQsIGV2YWw9RkFMU0V9DQojIGdlbmVyYXRlIFZpZ25ldHRlDQpsaWJyYXJ5KEJpb01vblRvb2xzKQ0KbGlicmFyeShkZXZ0b29scykNCmRldnRvb2xzOjpidWlsZF92aWduZXR0ZXMoKQ0KDQojIGNyZWF0ZSB2aWduZXR0ZSBmb2xkZXIgYW5kIGRlZmF1bHQgZmlsZQ0KI2RldnRvb2xzOjp1c2VfdmlnbmV0dGUoIkJDR2NhbGNfVmlnbmV0dGUiKQ0KYGBgDQpkZXZ0b29sczo6YnVpbGQoKSBtb3JlIHVzZWZ1bCBhbmQgYnVpbGRfdmlnbmV0dGVzKCkNCg0KIyMgQ3JlYXRlIFBhY2thZ2UNClVzZSB0aGUgY29kZSBiZWxvdyB0byBjcmVhdGUgdGhlIHBhY2thZ2UuICBBc3N1bWVzIHlvdSBhcmUgaW4gdGhlIGRldmVsb3BtZW50IHBhY2thZ2UgZGlyZWN0b3J5DQoNCmBgYHtyLCBldmFsPUZBTFNFfQ0KIyBMaWJyYXJ5IE5hbWUNCiMgTkVXUw0KIyBSZW5kZXIgdGhlbiBDb3B5IE5FV1Mgc28gcGlja2VkIHVwIGluIGhlbHANCnJtYXJrZG93bjo6cmVuZGVyKCJORVdTLnJtZCIsICJhbGwiKQ0KZmlsZS5jb3B5KCJORVdTLm1kIiwgIk5FV1MiLCBvdmVyd3JpdGUgPSBUUlVFKQ0KZmlsZS5yZW1vdmUoIk5FV1MuaHRtbCIpDQpmaWxlLnJlbW92ZSgiTkVXUy5tZCIpDQojDQpteVBrZyA8LSAiQmlvTW9uVG9vbHMiDQojIExvYWQgTGlicmFyeQ0KbGlicmFyeShkZXZ0b29scykNCiN+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+DQojIENyZWF0ZSBQYWNrYWdlDQojIGNyZWF0ZShteVBrZykNCiN+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+DQojDQojfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fg0KIyBEb2N1bWVudCwgSW5zdGFsbCwgYW5kIFJlbG9hZCBMaWJyYXJ5DQojIyBHZW5lcmF0ZSBEb2N1bWVudGF0aW9uDQpzZXR3ZChwYXN0ZTAoIi4vIixteVBrZykpICAjIHdpbGwgZmFpbCBhcyBhbHJlYWR5IGluIHRoaXMgZGlyZWN0b3J5DQpkZXZ0b29sczo6ZG9jdW1lbnQoKQ0KIyMgSW5zdGFsbCBOZXcgUGFja2FnZSAobG9jYWxseSkNCnNldHdkKCIuLiIpICMgcmV0dXJuIHRvIHJvb3QgZGlyZWN0b3J5IGZpcnN0DQpkZXZ0b29sczo6aW5zdGFsbChteVBrZywgcXVpY2s9RkFMU0UsIHJlbG9hZD1UUlVFLCBidWlsZF92aWduZXR0ZXMgPSBUUlVFKQ0KIyMgUmVsb2FkIGxpYnJhcnkNCmxpYnJhcnkobXlQa2csIGNoYXJhY3Rlci5vbmx5ID0gVFJVRSkNCiMgY2hhbmdlIHdkIGJhY2sgdG8gcGFja2FnZQ0Kc2V0d2QocGFzdGUwKCIuLyIsbXlQa2cpKQ0KI35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4NCmBgYA0KDQpBZnRlciBjcmVhdGluZyB0aGUgcGFja2FnZSByZWxvYWQgaXQgYWZ0ZXIgcmVzdGFydGluZyBSIHdpdGhpbiBSU3R1ZGlvIChDdHJsICsgU2hpZnQgKyBGMTApLg0KDQpgYGB7ciwgZXZhbD1GQUxTRX0NCiMgUmVzdGFydCBSIHdpdGhpbiBSU3R1ZGlvOiAgQ3RybCArIFNoaWZ0ICsgRjEwDQpteVBrZyA8LSAiQmlvTW9uVG9vbHMiDQpsaWJyYXJ5KG15UGtnLCBjaGFyYWN0ZXIub25seSA9IFRSVUUpDQpoZWxwKHBhY2thZ2U9KG15UGtnKSkNCiMNCmNpdGF0aW9uKG15UGtnKQ0KYGBgDQoNCiMjIyBSdW4gQWxsIEV4YW1wbGVzDQpSdW4gYWxsIGV4YW1wbGVzIGF0IG9uY2UgcmF0aGVyIHRoYW4gZ29pbmcgdG8gZWFjaCBmdW5jdGlvbiBpbmRpdmlkdWFsbHkuDQoNCkFkZCAiL190ZXN0IiB0byBnaXRpZ25vcmUNCg0KKE5lZWRzIHR3ZWFraW5nIHRvIGdldCBpdCB3b3JraW5nIHByb3Blcmx5KQ0KDQpgYGB7ciBBbGxFeGFtcGxlcywgZXZhbD1GQUxTRX0NCnBrZyA8LSAiQkNHY2FsYyINCnNldHdkKCIuL190ZXN0IikNCmRldnRvb2xzOjpydW5fZXhhbXBsZXMocGtnPXBrZykNCmBgYA0KDQoNCiMjIEluY2x1ZGluZyBEYXRhDQpBbGwgZGF0YSBzaG91bGQgaGF2ZSBhbHJlYWR5IGJlZW4gY3JlYXRlZC4NCg0KIyMgQ2hlY2sNCg0KYGBge3IsIGV2YWw9RkFMU0V9DQojIENoZWNrIGZvciBlcnJvcnMgKG9yIHByZXNzIENtZCArIFNoaWZ0ICsgRSBpbiBSU3R1ZGlvKQ0KI2h0dHA6Ly9yLXBrZ3MuaGFkLmNvLm56L2NoZWNrLmh0bWwNCmRldnRvb2xzOjpjaGVjaygpDQpgYGANCg0KSWYgdXNlIFJTdHVkaW8sIEJ1aWxkIC0gQ2hlY2sgUGFja2FnZSwgdGhlIG91dHB1dCBpcyBlYXNpZXIgdG8gcmVhZC4gDQoNCg0KIyMgVGVzdA0KTmVlZCB0byB1c2UgdGVzdHRoYXQgYnV0IG5vdCB0byB0aGF0IHN0YWdlIHlldC4NCg0KUlN0dWRpbywgQnVpbGQgLSBUZXN0IFBhY2thZ2UuDQoNCg0KIyBPdGhlciBTdHVmZg0KDQpgYGB7ciwgZXZhbD1GQUxTRX0NCiN+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+DQojIFVwbG9hZCB0byBHaXRodWIgdmlhIEdpdEh1YiBEZXNrdG9wIHV0aWxpdHkNCiMgMC4gZG93bmxvYWQgZnJvbSB3ZWIgdmlhICJjbG9uZSBvciBkb3dubG9hZCIgdmlhICJPcGVuIGluIERlc2t0b3AiIChHaXRIdWIgRGVza3RvcCkgaWYgbm90IGFscmVhZHkgaW4gR2l0SHViIERlc2t0b3ANCiMgMS4gTWFrZSBjaGFuZ2VzIGluIGRvd25sb2FkL2Nsb25lIGZvbGRlci4gKGRvbmUgYWJvdmUpDQojIDMuIE9wZW4gR0ggRGVza3RvcCBjb21taXQgY2hhbmdlcyB0aGVuIHN5bmMuDQojfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fg0KIyBpbnN0YWxsIGZyb20gR2l0SHViICh2aWEgZGV2dG9vbHMpDQpkZXZ0b29sczo6aW5zdGFsbF9naXRodWIocGFzdGUwKCJsZXBwb3R0LyIsbXlMaWJyYXJ5KSkNCiMNCg0KDQoNCiN+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+DQojIHJlbW92ZSBpbnN0YWxsZWQgcGFja2FnZXMgKGlmIG5lZWRlZCBmb3IgdHJvdWJsZXNob290aW5nKQ0Kc2VhcmNoKCkgIyBmaW5kDQojZGV0YWNoKDMpICMgcmVtb3ZlIGJ5IG51bWJlcg0KI35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4NCg0KDQojIHRvIGJ1aWxkIHBhY2thZ2UNCiNodHRwczovL3RoZXBvbGl0aWNhbG1ldGhvZG9sb2dpc3QuY29tLzIwMTQvMDgvMTQvYnVpbGRpbmctYW5kLW1haW50YWluaW5nLXItcGFja2FnZXMtd2l0aC1kZXZ0b29scy1hbmQtcm94eWdlbjIvDQojIFRvIGJ1aWxkIHRoZSBwYWNrYWdlIGFzIGEgY29tcHJlc3NlZCBmaWxlIGluIHlvdXIgd29ya2luZyBkaXJlY3RvcnksIHJ1biBidWlsZChjdXJyZW50LmNvZGUsIHBhdGg9Z2V0d2QoKSkuDQoNCiMgdG8gc2F2ZSBpbnRlcm5hbCBkYXRhIGZvciBleGFtcGxlcw0KIyBleGFtcGxlDQojaHR0cDovL3ItcGtncy5oYWQuY28ubnovZGF0YS5odG1sI2RhdGEtc3lzZGF0YQ0KIyBoYXZlIHRvIGJlIGF0IHJvb3QgZGlyZWN0b3J5IChhYm92ZSBwYWNrYWdlKQ0KI2RldnRvb2xzOjp1c2VfZGF0YShOVi5wcmVkaWN0b3JzLE5WLmJ1Z3MscGtnPSJNTUljYWxjTlYiLGludGVybmFsPVRSVUUsb3ZlcndyaXRlPVRSVUUpDQojIyB2ZXJpZnkgd2l0aCBkYXRhKCkNCg0KIyBUbyBzYXZlIFJNRCBmaWxlcw0KIyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzMwMzc3MjEzL2hvdy10by1pbmNsdWRlLXJtYXJrZG93bi1maWxlLWluLXItcGFja2FnZQ0KIyAvcGtnL2luc3Qvcm1kLw0KIyBzeXN0ZW0uZmlsZSgicm1kL2ZpbGUuUm1kIiwgcGFja2FnZT0icGFja2FnZW5hbWUiKQ0KIw0KI35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4NCiNodHRwczovL2hpbGFyeXBhcmtlci5jb20vMjAxNC8wNC8yOS93cml0aW5nLWFuLXItcGFja2FnZS1mcm9tLXNjcmF0Y2gvDQojIENyZWF0ZSBQYWNrYWdlDQojIGNyZWF0ZShteUxpYnJhcnkpDQoNCmBgYA0KDQoNCg==
diff --git a/man/MapTaxaObs.Rd b/man/MapTaxaObs.Rd index f2709670..c212c55f 100644 --- a/man/MapTaxaObs.Rd +++ b/man/MapTaxaObs.Rd @@ -5,7 +5,8 @@ \title{Taxa Observation Maps} \usage{ MapTaxaObs(df_obs, SampID, TaxaID, TaxaCount, Lat, Long, output_dir, - output_prefix = "maps.taxa", output_type = "pdf", database, regions, ...) + output_prefix = "maps.taxa", output_type = "pdf", database, regions, + ...) } \arguments{ \item{df_obs}{Observation data frame}