Introduction to echor
Michael Schramm
2024-05-15
Source:vignettes/introduction.Rmd
introduction.Rmd
echor introduction
echor
is an R package to search and download data from
the US Environmental Protection Agency (EPA) Environmental Compliance
and History Online (ECHO). echor
uses the ECHO API to download data directly to
the R as dataframes or simple features. ECHO provides information about
facilities permitted to emitted air pollutants or discharge into water
bodies. ECHO also provides data reported by permitted facilities as
volume or concentration of pollutants during reporting time periods
(typically annually for air emissions and monthly or quarterly for water
discharges).
ECHO provides data for:
- Stationary sources permitted under the Clean Air Act, including data from the National Emissions Inventory, Greenhouse Gas Reporting Program, Toxics Release Inventory, and Clean Air Markets Division Acid Rain Program and Clean Air Interstate Rule.
- Public drinking water systems permitted under the Safe Drinking Water Act, including data from the Safe Drinking Water Information System.
- Hazardous Waste Handlers permitted under the Resource Conservation and Recovery Act, with data drawn from the RCRAInfo data system.
- Facilities permitted under the Clean Water Act and the National Pollutant Discharge Elimination Systems (NPDES) program, including data from EPA’s ICIS-NPDES system and possibly water body information from EPA’s ATTAINS data system.
echor
currently provides functions to retrieve
information about permitted air dischargers, water dischargers, and
public drinking water supply systems. It also provides functions to
download discharge reports for permitted air and water dischargers.
echor
does not currently provide functionality to retrieve
RCRA data.
See https://echo.epa.gov/tools/web-services for information about ECHO web services and API functions.
Getting started
This vignette documents a few key functions to get started.
There are three types of functions:
Metadata
Retrieve metadata from ECHO to narrow the specify data returned or lookup parameter codes.
echoAirGetMeta()
- Returns variable name and descriptions for parameters returned in air facility queries.echoSDWGetMeta()
- Returns variable name and descriptions for parameters returned in public water system queries.echoWaterGetMeta()
- Returns variable name and descriptions for parameters returned in water discharge facility queries (e.g. facilities with an NPDES permit).echoWaterGetParams()
- Search parameter codes for constituent pollutants regulated under NPDES permits.
Query Facilities
Search and return facility information based on lookup parameters.
echoAirGetFacilityInfo()
- Returns a dataframe of permitted air discharge facilities and associated information based on lookup parameters specified by the user.echoSDWGetSystems()
- Returns a dataframe of permitted air discharge facilities and associated information based on lookup parameters specified by the user.echoWaterGetFacilityInfo()
- Returns a dataframe of permitted water discharge facilities and associated information based on lookup parameters specified by the user.
Reports
Search and return discharge and emissions reports for specified facilities.
echoGetCAAPR()
- Returns a dataframe with reported annual air emissions from permitted facilities.echoGetEffluent()
- Returns a dataframe with reported water effluent discharges from permitted facilities.
Sample workflows
Air
Suppose we want to find facilities permitted under the Clean Air Act requirements.
Step 1 - Identify the information we need returned from the query:
library(echor)
meta <- echoAirGetMeta()
meta
#> # A tibble: 376 × 6
#> ColumnName DataType DataLength ColumnID ObjectName Description
#> <chr> <chr> <chr> <chr> <chr> <chr>
#> 1 AIR_NAME VARCHAR2 200 1 AIRName NA
#> 2 SOURCE_ID VARCHAR2 30 2 SourceID Unique Ide…
#> 3 AIR_STREET VARCHAR2 200 3 AIRStreet NA
#> 4 AIR_CITY VARCHAR2 100 4 AIRCity NA
#> 5 AIR_STATE CHAR 2 5 AIRState NA
#> 6 LOCAL_CONTROL_REGION_CODE CHAR 3 6 LocalCont… NA
#> 7 AIR_ZIP VARCHAR2 10 7 AIRZip NA
#> 8 REGISTRY_ID VARCHAR2 50 8 RegistryID An interna…
#> 9 AIR_COUNTY VARCHAR2 100 9 AIRCounty NA
#> 10 AIR_EPA_REGION CHAR 2 10 AIREPAReg… NA
#> # ℹ 366 more rows
The dataframe includes ColumnID, which can be included as an argument
that specifies what information you want returned:
qcolumns = "1,2,3,22,23"
Step 2 - Create the query. The ECHO API provides numerous arguments
to search by that are not documented in this package. I recommend
exploring the documentation here: https://echo.epa.gov/tools/web-services/facility-search-air#!/Facilities/get_air_rest_services_get_facility_info.
In this example, we will search by a geographic bounding box and specify
the returned information with the qcolumns
argument. Each
argument should be passed to ECHO as
echoAirGetFacilityInfo(parameter = "value")
.
echor
will URL encode strings automatically. Please note
that any date argument needs to be entered as “mm/dd/yyyy”.
library(echor)
## Retrieve information about facilities within a geographic location
df <- echoAirGetFacilityInfo(output = "df",
p_c1lon = '-96.387509',
p_c1lat = '30.583572',
p_c2lon = '-96.281422',
p_c2lat = '30.640008',
qcolumns = "1,2,3,22,23")
AIRName | SourceID | AIRStreet | FacLat | FacLong |
---|---|---|---|---|
AGGIE CLEANERS | 06000000480416E020 | 111 COLLEGE MAIN | 30.61869 | -96.34588 |
ALL SEASONS 1 HR CLEANERS | 06000000480416E015 | 2501 TEXAS AVENUE SOUTH #D100 | 30.60704 | -96.30875 |
BLUEBONNET PAVING | TX0000004877700147 | HWY. 60, WEST OF | 30.61337 | -96.32098 |
BRYAN CLEANERS & LAUNDRY | 06000000480416E012 | 1803 HOLLEMAN DRIVE | 30.61225 | -96.31750 |
CITY OF BRYAN | TX0000004804100026 | 1.5 MI W OF @FM 1687 & FM 2818 | 30.63760 | -96.36235 |
COMET 1 HR CLEANERS | 06000000480416E013 | 1712 SOUTHWEST PARKWAY #101 | 30.60616 | -96.31034 |
Some example arguments are listed below:
p_fn string Facility Name Filter.
One or more case-insesitive facility names.
Provide multiple values as comma-delimited list
ex:
p_fn = "Aggie Cleaners, City of Bryan, TEXAS A&M UNIVERSITY COLLEGE STATION CAMPUS"
p_sa string Facility Street Address
ex:
p_sa = "WELLBORN ROAD & UNIVERSITY DR"
p_ct string Facility City
Provide a single case-insensitive city name
ex:
p_ct = "College Station"
p_co string Facility County
Provide a single county name, in combination with a state value
provided through p_st
ex:
p_co = "Brazos", p_st = "Texas"
p_fips string FIPS Code
Single 5-character Federal Information Processing Standards (FIPS)
state+county value
p_st string Facility State or State Equivalent Filter
Provide one or more USPS postal abbreviations
ex:
p_st = "TX, NC"
p_zip string Facility 5-Digit Zip Code
Provide one or more 5-digit postal zip codes
ex:
p_zip = "77843, 77845"
p_c1lon string Minimum longitude value in decimal degrees
p_c1lat string Minimum latitude value in decimal degrees
p_c2lon string Maximum longitude value in decimal degrees
p_c2lat string Maximum latitude value in decimal degrees
Step 3 - Download the emission inventory report for a permitted facility:
df <- echoGetCAAPR(p_id = '110000350174')
Name | SourceID | Street | City | State | Zip | County | Region | Latitude | Longitude | Pollutant | UnitsOfMeasure | Program | Year | Discharge |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
DUKE ENERGY PROGRESS, LLC - L.V. SUTTON ELECTRIC PLANT | 110000350174 | 801 SUTTON STEAM PLANT ROAD | WILMINGTON | NC | 28401 | NEW HANOVER | 04 | 34.28332 | -77.98523 | Nitrogen oxides | Pounds | CAMD | 2013 | 7361054 |
DUKE ENERGY PROGRESS, LLC - L.V. SUTTON ELECTRIC PLANT | 110000350174 | 801 SUTTON STEAM PLANT ROAD | WILMINGTON | NC | 28401 | NEW HANOVER | 04 | 34.28332 | -77.98523 | Nitrogen oxides | Pounds | CAMD | 2014 | 1153192 |
DUKE ENERGY PROGRESS, LLC - L.V. SUTTON ELECTRIC PLANT | 110000350174 | 801 SUTTON STEAM PLANT ROAD | WILMINGTON | NC | 28401 | NEW HANOVER | 04 | 34.28332 | -77.98523 | Nitrogen oxides | Pounds | CAMD | 2015 | 1094548 |
DUKE ENERGY PROGRESS, LLC - L.V. SUTTON ELECTRIC PLANT | 110000350174 | 801 SUTTON STEAM PLANT ROAD | WILMINGTON | NC | 28401 | NEW HANOVER | 04 | 34.28332 | -77.98523 | Nitrogen oxides | Pounds | CAMD | 2016 | 1137062 |
DUKE ENERGY PROGRESS, LLC - L.V. SUTTON ELECTRIC PLANT | 110000350174 | 801 SUTTON STEAM PLANT ROAD | WILMINGTON | NC | 28401 | NEW HANOVER | 04 | 34.28332 | -77.98523 | Nitrogen oxides | Pounds | CAMD | 2017 | 1237818 |
DUKE ENERGY PROGRESS, LLC - L.V. SUTTON ELECTRIC PLANT | 110000350174 | 801 SUTTON STEAM PLANT ROAD | WILMINGTON | NC | 28401 | NEW HANOVER | 04 | 34.28332 | -77.98523 | Nitrogen oxides | Pounds | CAMD | 2018 | 1102918 |
There are only two valid arguments for echoGetCAAPR
.
p_id string EPA Facility Registry Service's REGISTRY_ID.
p_units string Units of measurement. Defaults is 'lbs'.
Enter "TPWE" for toxic weighted pounds equivalents.
Water facility and discharge searches
Find facilities with NPDES permits to discharge wastewater:
df <- echoWaterGetFacilityInfo(p_c1lon = '-96.407563', p_c1lat = '30.554395',
p_c2lon = '-96.25947', p_c2lat = '30.751984',
output = 'df', qcolumns = "1,2,3,4,5,6,7")
CWPName | SourceID | CWPStreet | CWPCity | CWPState | CWPStateDistrict | CWPZip |
---|---|---|---|---|---|---|
066-3344 BORLAUG CENTER RENOVATION ADDITION | TXR1579LK | 600 JOHN KIMBROUGH BLVD | COLLEGE STATION | TX | 9 | 77843-0001 |
1407 CONNOR STREET | TXR1539NY | 1407 CONNOR STREET | BRYAN | TX | 9 | 77808 |
2900 SPECTOR DRIVE | TXR1571JJ | 2900 SPECTOR DRIVE | BRYAN | TX | NA | 77802 |
2901 SPECTOR DRIVE | TXR1531KC | 2901 SPECTOR DRIVE | BRYAN | TX | NA | 77802 |
2921 SPECTOR DRIVE | TXR1587NL | 2921 SPECTOR DR | BRYAN | TX | NA | 77802 |
3444 MAHOGANY DRIVE | TXR1509EW | SOUTHWEST OF THE INTERSECTION OF MAHOGANY DRIVE AN | BRYAN | TX | NA | 77807 |
Again, there are a ton of possible arguments to query ECHO with. All arguments are described here: https://echo.epa.gov/tools/web-services/facility-search-water#!/Facility_Information/get_cwa_rest_services_get_facility_info
Commonly used arguments are provided below:
p_fn string Facility Name Filter.
One or more case-insesitive facility names.
Provide multiple values as comma-delimited list
ex:
p_fn = "Aggie Cleaners, City of Bryan, TEXAS A&M UNIVERSITY COLLEGE STATION CAMPUS"
p_sa string Facility Street Address
ex:
p_sa = "WELLBORN ROAD & UNIVERSITY DR"
p_ct string Facility City
Provide a single case-insensitive city name
ex:
p_ct = "College Station"
p_co string Facility County
Provide a single county name, in combination with a state value
provided through p_st
ex:
p_co = "Brazos", p_st = "Texas"
p_fips string FIPS Code
Single 5-character Federal Information Processing Standards (FIPS)
state+county value
p_st string Facility State or State Equivalent Filter
Provide one or more USPS postal abbreviations
ex:
p_st = "TX, NC"
p_zip string Facility 5-Digit Zip Code
Provide one or more 5-digit postal zip codes
ex:
p_zip = "77843, 77845"
p_c1lon string Minimum longitude value in decimal degrees
p_c1lat string Minimum latitude value in decimal degrees
p_c2lon string Maximum longitude value in decimal degrees
p_c1lat string Maximum latitude value in decimal degrees
p_huc string 2-,4,6-,or 8-digit watershed code.
May contain comma-seperated values
Download discharge monitoring reports from ECHO from specified facilities:
df <- echoGetEffluent(p_id = 'tx0119407', parameter_code = '50050')
activity_id | npdes_id | version_nmbr | perm_feature_id | perm_feature_nmbr | perm_feature_type_code | perm_feature_type_desc | limit_set_id | limit_set_schedule_id | limit_id | limit_season_id | limit_type_code | limit_begin_date | limit_end_date | nmbr_of_submission | parameter_code | parameter_desc | monitoring_location_code | monitoring_location_desc | stay_type_code | stay_type_desc | limit_value_id | limit_value_type_code | limit_value_type_desc | limit_value_nmbr | limit_unit_code | limit_unit_desc | standard_unit_code | standard_unit_desc | limit_value_standard_units | statistical_base_code | statistical_base_short_desc | statistical_base_type_code | statistical_base_type_desc | limit_value_qualifier_code | stay_value_nmbr | dmr_event_id | monitoring_period_end_date | dmr_form_value_id | value_type_code | value_type_desc | dmr_value_id | dmr_value_nmbr | dmr_unit_code | dmr_unit_desc | dmr_value_standard_units | dmr_value_qualifier_code | value_received_date | days_late | nodi_code | nodi_desc | exceedence_pct | npdes_violation_id | violation_code | violation_desc | rnc_detection_code | rnc_detection_desc | rnc_detection_date | rnc_resolution_code | rnc_resolution_desc | rnc_resolution_date | violation_severity | dmr_due_date | dmr_limit_type_code_desc | dmr_limit_type_desc |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
3602064155 | TX0119407 | 0 | 3600435311 | 001 | EXO | External Outfall | 3600478276 | 3600684408 | 3604917390 | 0 | ENF | 01/01/2020 | 12/06/2024 | 1 | 50050 | Flow, in conduit or thru treatment plant | 1 | Effluent Gross | 3608344140 | Q2 | Quantity2 | 03 | MGD | 03 | MGD | DD | DAILY MX | MAX | Maximum | 3612968295 | 01/31/2021 | 3788199991 | Q2 | Quantity2 | 3732924938 | .0849 | 03 | MGD | .0849 | = | 02/10/2021 | No Violation Identified | 02/20/2021 | Enforcement | Base Permit | |||||||||||||||||||
3602064155 | TX0119407 | 0 | 3600435311 | 001 | EXO | External Outfall | 3600478276 | 3600684408 | 3604917390 | 0 | ENF | 01/01/2020 | 12/06/2024 | 1 | 50050 | Flow, in conduit or thru treatment plant | 1 | Effluent Gross | 3608344141 | Q1 | Quantity1 | .131 | 03 | MGD | 03 | MGD | .131 | DB | DAILY AV | AVG | Average | <= | 3612968295 | 01/31/2021 | 3788199987 | Q1 | Quantity1 | 3732924937 | .0604 | 03 | MGD | .0604 | = | 02/10/2021 | No Violation Identified | 02/20/2021 | Enforcement | Base Permit | ||||||||||||||||
3602064155 | TX0119407 | 0 | 3600435311 | 001 | EXO | External Outfall | 3600478276 | 3600684408 | 3604917390 | 0 | ENF | 01/01/2020 | 12/06/2024 | 1 | 50050 | Flow, in conduit or thru treatment plant | 1 | Effluent Gross | 3608344141 | Q1 | Quantity1 | .131 | 03 | MGD | 03 | MGD | .131 | DB | DAILY AV | AVG | Average | <= | 3612968298 | 02/28/2021 | 3788200098 | Q1 | Quantity1 | 3735355399 | .0569 | 03 | MGD | .0569 | = | 03/09/2021 | No Violation Identified | 03/20/2021 | Enforcement | Base Permit | ||||||||||||||||
3602064155 | TX0119407 | 0 | 3600435311 | 001 | EXO | External Outfall | 3600478276 | 3600684408 | 3604917390 | 0 | ENF | 01/01/2020 | 12/06/2024 | 1 | 50050 | Flow, in conduit or thru treatment plant | 1 | Effluent Gross | 3608344140 | Q2 | Quantity2 | 03 | MGD | 03 | MGD | DD | DAILY MX | MAX | Maximum | 3612968298 | 02/28/2021 | 3788200099 | Q2 | Quantity2 | 3735355400 | .1109 | 03 | MGD | .1109 | = | 03/09/2021 | No Violation Identified | 03/20/2021 | Enforcement | Base Permit | |||||||||||||||||||
3602064155 | TX0119407 | 0 | 3600435311 | 001 | EXO | External Outfall | 3600478276 | 3600684408 | 3604917390 | 0 | ENF | 01/01/2020 | 12/06/2024 | 1 | 50050 | Flow, in conduit or thru treatment plant | 1 | Effluent Gross | 3608344140 | Q2 | Quantity2 | 03 | MGD | 03 | MGD | DD | DAILY MX | MAX | Maximum | 3612968306 | 03/31/2021 | 3788200195 | Q2 | Quantity2 | 3736849014 | .0809 | 03 | MGD | .0809 | = | 04/13/2021 | No Violation Identified | 04/20/2021 | Enforcement | Base Permit | |||||||||||||||||||
3602064155 | TX0119407 | 0 | 3600435311 | 001 | EXO | External Outfall | 3600478276 | 3600684408 | 3604917390 | 0 | ENF | 01/01/2020 | 12/06/2024 | 1 | 50050 | Flow, in conduit or thru treatment plant | 1 | Effluent Gross | 3608344141 | Q1 | Quantity1 | .131 | 03 | MGD | 03 | MGD | .131 | DB | DAILY AV | AVG | Average | <= | 3612968306 | 03/31/2021 | 3788200189 | Q1 | Quantity1 | 3736849013 | .0581 | 03 | MGD | .0581 | = | 04/13/2021 | No Violation Identified | 04/20/2021 | Enforcement | Base Permit |
This function only retrieves from a single facility per call. The following arguments are available from ECHO:
p_id string EPA Facility Registry Service's REGISTRY_ID.
outfall string Three-character code identifying the point of discharge.
parameter_code string Five-digit numeric code identifying the parameter.
start_date string Start date of interest. Must be entered as "mm/dd/yyyy"
end_date string End date of interest. Must be entered as "mm/dd/yyyy"
Parameters codes can be searched using
echoWaterGetParams
.
echoWaterGetParams(term = "Oxygen, dissolved")
#> # A tibble: 5 × 2
#> ValueCode ValueDescription
#> <chr> <chr>
#> 1 00300 Oxygen, dissolved [DO]
#> 2 51646 Oxygen, dissolved [DO] maximum
#> 3 51645 Oxygen, dissolved [DO] minimum
#> 4 00301 Oxygen, dissolved percent saturation
#> 5 00399 Oxygen, dissolved, % of time violated
Multiple DMRs can be downloaded using a helper function:
downloadDMRs
:
df <- tibble::tibble(permit = c('TX0119407', 'TX0062677'))
df <- downloadDMRs(df, idColumn = permit)
df <- df %>%
tidyr::unnest(dmr)
tibble::glimpse(df)
#> Rows: 2,479
#> Columns: 66
#> $ permit <chr> "TX0119407", "TX0119407", "TX0119407", "TX…
#> $ activity_id <chr> "3602064155", "3602064155", "3602064155", …
#> $ npdes_id <chr> "TX0119407", "TX0119407", "TX0119407", "TX…
#> $ version_nmbr <chr> "0", "0", "0", "0", "0", "0", "0", "0", "0…
#> $ perm_feature_id <chr> "3600435311", "3600435311", "3600435311", …
#> $ perm_feature_nmbr <chr> "001", "001", "001", "001", "001", "001", …
#> $ perm_feature_type_code <chr> "EXO", "EXO", "EXO", "EXO", "EXO", "EXO", …
#> $ perm_feature_type_desc <chr> "External Outfall", "External Outfall", "E…
#> $ limit_set_id <chr> "3600478276", "3600478276", "3600478276", …
#> $ limit_set_schedule_id <chr> "3600684408", "3600684408", "3600684408", …
#> $ limit_id <chr> "3604917385", "3604917385", "3604917385", …
#> $ limit_season_id <chr> "0", "0", "0", "0", "0", "0", "0", "0", "0…
#> $ limit_type_code <chr> "ENF", "ENF", "ENF", "ENF", "ENF", "ENF", …
#> $ limit_begin_date <chr> "01/01/2020", "01/01/2020", "01/01/2020", …
#> $ limit_end_date <chr> "12/06/2024", "12/06/2024", "12/06/2024", …
#> $ nmbr_of_submission <chr> "1", "1", "1", "1", "1", "1", "1", "1", "1…
#> $ parameter_code <chr> "00300", "00300", "00300", "00300", "00300…
#> $ parameter_desc <chr> "Oxygen, dissolved [DO]", "Oxygen, dissolv…
#> $ monitoring_location_code <chr> "1", "1", "1", "1", "1", "1", "1", "1", "1…
#> $ monitoring_location_desc <chr> "Effluent Gross", "Effluent Gross", "Efflu…
#> $ stay_type_code <chr> "", "", "", "", "", "", "", "", "", "", ""…
#> $ stay_type_desc <chr> "", "", "", "", "", "", "", "", "", "", ""…
#> $ limit_value_id <chr> "3608344130", "3608344130", "3608344130", …
#> $ limit_value_type_code <chr> "C1", "C1", "C1", "C1", "C1", "C1", "C1", …
#> $ limit_value_type_desc <chr> "Concentration1", "Concentration1", "Conce…
#> $ limit_value_nmbr <chr> "4", "4", "4", "4", "4", "4", "4", "4", "4…
#> $ limit_unit_code <chr> "19", "19", "19", "19", "19", "19", "19", …
#> $ limit_unit_desc <chr> "mg/L", "mg/L", "mg/L", "mg/L", "mg/L", "m…
#> $ standard_unit_code <chr> "19", "19", "19", "19", "19", "19", "19", …
#> $ standard_unit_desc <chr> "mg/L", "mg/L", "mg/L", "mg/L", "mg/L", "m…
#> $ limit_value_standard_units <chr> "4", "4", "4", "4", "4", "4", "4", "4", "4…
#> $ statistical_base_code <chr> "MO", "MO", "MO", "MO", "MO", "MO", "MO", …
#> $ statistical_base_short_desc <chr> "MO MIN", "MO MIN", "MO MIN", "MO MIN", "M…
#> $ statistical_base_type_code <chr> "MIN", "MIN", "MIN", "MIN", "MIN", "MIN", …
#> $ statistical_base_type_desc <chr> "Minimum", "Minimum", "Minimum", "Minimum"…
#> $ limit_value_qualifier_code <chr> ">=", ">=", ">=", ">=", ">=", ">=", ">=", …
#> $ stay_value_nmbr <chr> "", "", "", "", "", "", "", "", "", "", ""…
#> $ dmr_event_id <chr> "3612968295", "3612968298", "3612968306", …
#> $ monitoring_period_end_date <chr> "01/31/2021", "02/28/2021", "03/31/2021", …
#> $ dmr_form_value_id <chr> "3788199942", "3788200055", "3788200133", …
#> $ value_type_code <chr> "C1", "C1", "C1", "C1", "C1", "C1", "C1", …
#> $ value_type_desc <chr> "Concentration1", "Concentration1", "Conce…
#> $ dmr_value_id <chr> "3732924936", "3735355411", "3736849023", …
#> $ dmr_value_nmbr <chr> "5.9", "5.73", "5.6", "4.7", "5.52", "5.79…
#> $ dmr_unit_code <chr> "19", "19", "19", "19", "19", "19", "19", …
#> $ dmr_unit_desc <chr> "mg/L", "mg/L", "mg/L", "mg/L", "mg/L", "m…
#> $ dmr_value_standard_units <chr> "5.9", "5.73", "5.6", "4.7", "5.52", "5.79…
#> $ dmr_value_qualifier_code <chr> "=", "=", "=", "=", "=", "=", "=", "=", "=…
#> $ value_received_date <chr> "02/10/2021", "03/09/2021", "04/13/2021", …
#> $ days_late <chr> "", "", "", "", "", "", "", "", "", "", ""…
#> $ nodi_code <chr> "", "", "", "", "", "", "", "", "", "", ""…
#> $ nodi_desc <chr> "", "", "", "", "", "", "", "", "", "", ""…
#> $ exceedence_pct <chr> "", "", "", "", "", "", "", "", "", "", ""…
#> $ npdes_violation_id <chr> "", "", "", "", "", "", "", "", "", "", ""…
#> $ violation_code <chr> "", "", "", "", "", "", "", "", "", "", ""…
#> $ violation_desc <chr> "", "", "", "", "", "", "", "", "", "", ""…
#> $ rnc_detection_code <chr> "", "", "", "", "", "", "", "", "", "", ""…
#> $ rnc_detection_desc <chr> "", "", "", "", "", "", "", "", "", "", ""…
#> $ rnc_detection_date <chr> "", "", "", "", "", "", "", "", "", "", ""…
#> $ rnc_resolution_code <chr> "", "", "", "", "", "", "", "", "", "", ""…
#> $ rnc_resolution_desc <chr> "", "", "", "", "", "", "", "", "", "", ""…
#> $ rnc_resolution_date <chr> "", "", "", "", "", "", "", "", "", "", ""…
#> $ violation_severity <chr> "No Violation Identified", "No Violation I…
#> $ dmr_due_date <chr> "02/20/2021", "03/20/2021", "04/20/2021", …
#> $ dmr_limit_type_code_desc <chr> "Enforcement", "Enforcement", "Enforcement…
#> $ dmr_limit_type_desc <chr> "Base Permit", "Base Permit", "Base Permit…