<p><div><div><div><div data-show-faces="false" data-height="21" data-width="100" data-layout="button_count" data-send="true" data-href="https://www.r-bloggers.com/what-birds-are-observed-near-radolfzell-bird-occurrence-data-in-r/"></div></div><div></div></div><div></div></div>
<div>
(This article was first published on <strong><a href="https://ropensci.org/blog/2018/08/21/birds-radolfzell/"> rOpenSci - open tools for open science</a></strong>, and kindly contributed to <a rel="nofollow" href="https://www.r-bloggers.com/">R-bloggers)</a> </div>
<p>Thanks to the <a rel="nofollow" href="https://ropensci.org/blog/2018/08/14/where-to-bird/" target="_blank">first post of the<br>
series</a> we know<br>
where to observe birds near Radolfzellâ€<img alt="™" src="https://s.w.org/images/core/emoji/11/72x72/2122.png" class="wp-smiley">s Max Planck Institute for<br>
Ornithology, so we could go and do that! Or we can stay behind our<br>
laptops and take advantage of <a rel="nofollow" href="https://ebird.org/home" target="_blank">eBird</a>, a<br>
fantastic bird sightings aggregator! As explained by Matt Strimas-Mackey<br>
in <a rel="nofollow" href="https://ropensci.org/blog/2018/08/07/auk/" target="_blank">his recent blog post</a>,<br>
â€œThe eBird database currently contains over 500 million records of bird<br>
sightings, spanning every country and over 98% of species, making it an<br>
extremely valuable resource for bird research and conservation.â€�.</p>
<p>Luckily for us, there are no less than <em>two</em> rOpenSci packages giving us<br>
access to eBird data! In this blog post, I shall play with both of them,<br>
highlighting their respective strengths, while discovering what birds<br>
are observed in the area.</p>
<h3>How to access eBird data?</h3>
<p>There are two ways to access eBird data with an R package for each of<br>
these methods,</p>
<ul>
<li>
<p>whole dataset download via <code>auk</code> maintained by <a rel="nofollow" href="http://strimas.com/" target="_blank">Matt<br>
Strimas-Mackey</a>,</p>
</li>
<li>
<p>APIs, via <code>rebird</code> maintained by <a rel="nofollow" href="http://sebpardo.github.io/" target="_blank">Sebastian<br>
Pardo</a>.</p>
</li>
</ul>
<p>Your use case will help you decide which entry point is the most<br>
appropriate for your use case. <em>Note that both packages have documented<br>
their respective applications in order to help potential users:<br>
<a rel="nofollow" href="https://github.com/ropensci/rebird#auk-vs-rebird" target="_blank"><code>rebird</code> README</a>,<br>
<a rel="nofollow" href="https://github.com/CornellLabofOrnithology/auk#auk-vs-rebird" target="_blank"><code>auk</code><br>
README</a>.</em></p>
<ul>
<li>
<p>You want to study a region, or a bird, quite deeply and you even<br>
want absence/presence data, not only presence data. Use <code>auk</code>!</p>
</li>
<li>
<p>You want to build a tool based on recent observations only or you<br>
want to get a quick taste of eBirdâ€<img alt="™" src="https://s.w.org/images/core/emoji/11/72x72/2122.png" class="wp-smiley">s data. Use <code>rebird</code>!</p>
</li>
<li>
<p>A bit provocatively, do you want birds data only? If not, maybe<br>
youâ€<img alt="™" src="https://s.w.org/images/core/emoji/11/72x72/2122.png" class="wp-smiley">ll need a combination of <code>auk</code>/<code>rebird</code> and another package.<br>
Check out this list of <a rel="nofollow" href="https://github.com/ropensci/spocc#spocc" target="_blank">data providers covered by<br>
<code>spocc</code></a>, umbrella package<br>
for rOpenSciâ€<img alt="™" src="https://s.w.org/images/core/emoji/11/72x72/2122.png" class="wp-smiley">s packages accessing occurrence data. Many data sources<br>
actually end up in <a rel="nofollow" href="https://www.gbif.org/dataset/search" target="_blank">GBIF<br>
datasets</a>, eBird seems to<br>
upload their data there once a year.</p>
</li>
<li>
<p>You want to analyze <em>your</em> eBirdâ€<img alt="™" src="https://s.w.org/images/core/emoji/11/72x72/2122.png" class="wp-smiley">s sightings? Check out the<br>
work-in-progress <a rel="nofollow" href="https://github.com/sebpardo/myebird" target="_blank"><code>myebird</code></a> by<br>
<a rel="nofollow" href="http://sebpardo.github.io/" target="_blank">Sebastian Pardo</a>, <code>rebird</code>â€<img alt="™" src="https://s.w.org/images/core/emoji/11/72x72/2122.png" class="wp-smiley">s<br>
maintainer, and <a rel="nofollow" href="http://www.ebirdedgeapp.io/" target="_blank">this app</a> by <a rel="nofollow" href="https://www.sfu.ca/biology/people/profiles/svaldez.html" target="_blank">SimÃ³n<br>
Valdez-Juarez</a><br>
and <a rel="nofollow" href="http://sebpardo.github.io/" target="_blank">Sebastian Pardo</a> highlighting the<br>
most endangered species you observed.</p>
</li>
<li>
<p>Youâ€<img alt="™" src="https://s.w.org/images/core/emoji/11/72x72/2122.png" class="wp-smiley">re writing a birderâ€<img alt="™" src="https://s.w.org/images/core/emoji/11/72x72/2122.png" class="wp-smiley">s guide to rOpenSci? Use both <code>rebird</code> and<br>
<code>auk</code> to show them off!</p>
</li>
</ul>
<h3>How to get access to eBirdâ€<img alt="™" src="https://s.w.org/images/core/emoji/11/72x72/2122.png" class="wp-smiley">s data</h3>
<h4>Whole eBird dataset, quarterly updated</h4>
<p>One needs to first <a rel="nofollow" href="https://secure.birds.cornell.edu/cassso/login" target="_blank">create an eBird<br>
account</a> and <a rel="nofollow" href="https://ebird.org/data/request" target="_blank">then<br>
request access to the data</a>. Once one<br>
has gotten green light from eBird (in my case a few days following my<br>
request), after a small dance of joy itâ€<img alt="™" src="https://s.w.org/images/core/emoji/11/72x72/2122.png" class="wp-smiley">s time to head to eBirdâ€<img alt="™" src="https://s.w.org/images/core/emoji/11/72x72/2122.png" class="wp-smiley">s<br>
<a rel="nofollow" href="https://ebird.org/data/download/ebd" target="_blank">download page</a>. If one doesnâ€<img alt="™" src="https://s.w.org/images/core/emoji/11/72x72/2122.png" class="wp-smiley">t<br>
want nor need to download the whole eBird Basic Dataset (EBD), one can<br>
request a custom download, which I did, asking for only the data for<br>
Germany which I got after a few days (the time to receiving the link to<br>
download a custom dataset is variable). While waiting, I worked on the<br>
<code>rebird</code> part of this post, among other things.</p>
<h4>API key? Not yet</h4>
<p>At the moment, <code>rebird</code> interfaces the version 1.1 eBird APIs that will<br>
be retired <a rel="nofollow" href="https://documenter.getpostman.com/view/664302/ebird-api-20/2HTbHW" target="_blank">â€œat some point in the<br>
futureâ€�</a>.<br>
When this happens, the <code>rebird</code> package <a rel="nofollow" href="https://github.com/ropensci/rebird/issues/58" target="_blank">will use the new<br>
API</a> which will mean<br>
youâ€<img alt="™" src="https://s.w.org/images/core/emoji/11/72x72/2122.png" class="wp-smiley">ll need an API key. Currently, though, you donâ€<img alt="™" src="https://s.w.org/images/core/emoji/11/72x72/2122.png" class="wp-smiley">t need any<br>
authentication to use <code>rebird</code>.</p>
<h3>Using <code>rebird</code> while waiting for the eBirdâ€<img alt="™" src="https://s.w.org/images/core/emoji/11/72x72/2122.png" class="wp-smiley">s full dataset</h3>
<p>In the following, weâ€<img alt="™" src="https://s.w.org/images/core/emoji/11/72x72/2122.png" class="wp-smiley">ll use the rOpenSciâ€<img alt="™" src="https://s.w.org/images/core/emoji/11/72x72/2122.png" class="wp-smiley">s package <code>rebird</code> to get and<br>
map all observations in the last 30 days near Radolfzell in Germany.</p>
<p>The <em>Radolfzell</em> part of that sentence is a bit different than in <a rel="nofollow" href="https://ropensci.org/blog/2018/08/14/where-to-bird/" target="_blank">the<br>
last post about finding bird hides near the MPI institute for<br>
ornithology</a>: I<br>
want all observations inside the polygon of the district of Constance<br>
(Landkreis Konstanz, including Radolfzellâ€¦ and a protected natural<br>
area!) so Iâ€<img alt="™" src="https://s.w.org/images/core/emoji/11/72x72/2122.png" class="wp-smiley">ll first need to get it. For doing that Iâ€<img alt="™" src="https://s.w.org/images/core/emoji/11/72x72/2122.png" class="wp-smiley">ll use<br>
<code>osmdata::getbb</code>, that uses the free Nominatim API provided by<br>
Openstreetmap.</p>
<pre><code>library(&quot;sf&quot;)
landkreis_konstanz &lt;- osmdata::getbb(&quot;Landkreis Konstanz&quot;,
                             format_out = &quot;sf_polygon&quot;)

plot(landkreis_konstanz)
</code></pre>
<p><img alt="Limits of the County of
Constance" src="https://i0.wp.com/ropensci.org/img/blog-images/2018-08-21-birds-radolfzell/lk-1.png?w=456&ssl=1" data-recalc-dims="1"></p>
<p>Neither <code>rebird</code> nor <code>spocc</code> currently offer built-in trimming of<br>
occurrence data to a polygon (whereas <code>osmdata</code> does). A further<br>
difficulty created by eBirdâ€<img alt="™" src="https://s.w.org/images/core/emoji/11/72x72/2122.png" class="wp-smiley">s API is that it doesnâ€<img alt="™" src="https://s.w.org/images/core/emoji/11/72x72/2122.png" class="wp-smiley">t allow for the use<br>
of a bounding box, but instead demands a <code>lat</code>, <code>lng</code> and a <code>dist</code><br>
defining the radius of interest from given <code>lat</code>/<code>lng</code> in kilometers.<br>
Thanks to <a rel="nofollow" href="https://marcosci.rbind.io/" target="_blank">Marco Sciaini</a> for providing me<br>
with an easy way to compute <code>dist</code>, using the <code>sf</code> package.</p>
<pre><code>coord &lt;- sf::st_coordinates(landkreis_konstanz)

bbox &lt;- c(x1 = min(coord[, &quot;X&quot;]),
          x2 = max(coord[, &quot;X&quot;]),
          y1 = min(coord[, &quot;Y&quot;]),
          y2 = max(coord[, &quot;Y&quot;]))


center &lt;- c(x = (bbox[&quot;x1&quot;] + bbox[&quot;x2&quot;])/2,
            y = (bbox[&quot;y1&quot;] + bbox[&quot;y2&quot;])/2)

dist &lt;- landkreis_konstanz %>%
  sf::st_cast(&quot;POINT&quot;) %>%
  sf::st_distance() %>% 
  max() * 0.5

dist
</code></pre>
<pre><code>## 24129.15 m
</code></pre>
<p>Now, we can make the query.</p>
<pre><code>birds &lt;- rebird::ebirdgeo(species = NULL,
                          lng = center[&quot;x.x1&quot;],
                          lat = center[&quot;y.y1&quot;],
                          back = 30,
                          dist = as.numeric(
                            units::set_units(dist, &quot;km&quot;)))
nrow(birds)
</code></pre>
<pre><code>## [1] 55
</code></pre>
<pre><code>str(birds)
</code></pre>
<pre><code>## Classes 'tbl_df', 'tbl' and 'data.frame':    55 obs. of  12 variables:
##  $ lng            : num  8.94 8.94 8.94 8.94 8.94 ...
##  $ locName        : chr  &quot;Radolfzeller AachmÃ¼ndung (Bodensee)&quot; &quot;Radolfzeller AachmÃ¼ndung (Bodensee)&quot; &quot;Radolfzeller AachmÃ¼ndung (Bodensee)&quot; &quot;Radolfzeller AachmÃ¼ndung (Bodensee)&quot; ...
##  $ sciName        : chr  &quot;Chroicocephalus ridibundus&quot; &quot;Motacilla alba&quot; &quot;Rallus aquaticus&quot; &quot;Aythya fuligula&quot; ...
##  $ obsValid       : logi  TRUE TRUE TRUE TRUE TRUE TRUE ...
##  $ locationPrivate: logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
##  $ obsDt          : chr  &quot;2018-08-08 13:30&quot; &quot;2018-08-08 13:30&quot; &quot;2018-08-08 13:30&quot; &quot;2018-08-08 13:30&quot; ...
##  $ obsReviewed    : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
##  $ comName        : chr  &quot;Black-headed Gull&quot; &quot;White Wagtail&quot; &quot;Water Rail&quot; &quot;Tufted Duck&quot; ...
##  $ lat            : num  47.7 47.7 47.7 47.7 47.7 ...
##  $ locID          : chr  &quot;L3314048&quot; &quot;L3314048&quot; &quot;L3314048&quot; &quot;L3314048&quot; ...
##  $ locId          : chr  &quot;L3314048&quot; &quot;L3314048&quot; &quot;L3314048&quot; &quot;L3314048&quot; ...
##  $ howMany        : int  NA 2 1 1 NA 3 NA NA 8 20 ...
</code></pre>
<p>Now that we have the occurrence data, letâ€<img alt="™" src="https://s.w.org/images/core/emoji/11/72x72/2122.png" class="wp-smiley">s plot it to see whether<br>
trimming is required.</p>
<pre><code>crs &lt;- sf::st_crs(landkreis_konstanz)

birds_sf &lt;- sf::st_as_sf(birds,
                         coords = c(&quot;lng&quot;, &quot;lat&quot;), 
                         crs = crs)
library(&quot;ggplot2&quot;)
ggplot() +
  geom_sf(data = landkreis_konstanz) +
  geom_sf(data = birds_sf) +
  theme(legend.position = &quot;bottom&quot;) +
  hrbrthemes::theme_ipsum() +
  ggtitle(&quot;eBird observations over the last 30 days&quot;,
          subtitle = &quot;Observations within a circle around the County of Constance&quot;)
</code></pre>
<p><img alt="map of raw observations within a
circle" src="https://i2.wp.com/ropensci.org/img/blog-images/2018-08-21-birds-radolfzell/map_circle-1.png?w=456&ssl=1" data-recalc-dims="1"></p>
<p>Yes, trimming is required! Itâ€<img alt="™" src="https://s.w.org/images/core/emoji/11/72x72/2122.png" class="wp-smiley">d have been too bad not to learn how to do<br>
it, anyway. We also add the MPI to the map.</p>
<pre><code># which parts of the oject are in the county
in_indices &lt;- sf::st_within(birds_sf, landkreis_konstanz)

# filter them
trimmed_birds &lt;- dplyr::filter(birds_sf,
                               lengths(in_indices) > 0)

# summarize to get no. of birds by  location
summarized_birds &lt;- trimmed_birds %>%
  dplyr::group_by(locName) %>%
  dplyr::summarise(n = n())

# MPI 
mpi &lt;- opencage::opencage_forward(&quot;Am Obstberg 1 78315 Radolfzell&quot;, 
                                  limit = 1)$results

coords &lt;- data.frame(lon = mpi$geometry.lng,
                     lat = mpi$geometry.lat)

crs &lt;- sf::st_crs(landkreis_konstanz)

mpi_sf &lt;- sf::st_as_sf(coords,
                       coords = c(&quot;lon&quot;, &quot;lat&quot;), 
                       crs = crs)

# Map!
ggplot() +
  geom_sf(data = landkreis_konstanz) +
  geom_sf(data = summarized_birds,
          aes(size = n), show.legend = &quot;point&quot;) +
  hrbrthemes::theme_ipsum() +
  ggtitle(&quot;eBird observations over the last 30 days&quot;,
          subtitle = &quot;County of Constance, MPI as a triangle&quot;) +
  geom_sf(data = mpi_sf,
          shape = 2) 
</code></pre>
<p><img alt="trimmed observations in the
county" src="https://i2.wp.com/ropensci.org/img/blog-images/2018-08-21-birds-radolfzell/trimmed1-1.png?w=456&ssl=1" data-recalc-dims="1"></p>
<p>We got 49 observations (<code>nrow(trimmed_birds)</code>) of 49 species<br>
(<code>length(unique(trimmed_birds$comName))</code>), over 2 places<br>
(<code>length(unique(trimmed_birds$locName))</code>) during 5 observation sessions.<br>
Hopefully merely an appetizer to what we can get from using the full<br>
eBird dataset in the next sectionâ€¦</p>
<p>Note that the initial query could have been made with <code>spocc</code> which<br>
would have helped using the rOpenSci occurrence suite.</p>
<pre><code>birds2 &lt;- spocc::occ(from = &quot;ebird&quot;,
                     ebirdopts = list(method = &quot;ebirdgeo&quot;,
                                      species = NULL,
                                      lng = center[&quot;x.x1&quot;],
                                      lat = center[&quot;y.y1&quot;],
                                      back = 30,
                                      dist = as.numeric(
                                        units::set_units(dist, &quot;km&quot;))))
                     
mapr::map_leaflet(birds2)
</code></pre>
<p><img alt="mapr leaflet map of observations
locations" src="https://i0.wp.com/ropensci.org/img/blog-images/2018-08-21-birds-radolfzell/mapr-1.png?w=456&ssl=1" data-recalc-dims="1"><br>
<br> Quite handy!</p>
<p>Now, letâ€<img alt="™" src="https://s.w.org/images/core/emoji/11/72x72/2122.png" class="wp-smiley">s explore the whole eBird dataset for Germany.</p>
<h3>Using <code>auk</code> to process EBD dataset for Germany</h3>
<p>After getting access to a custom dataset corresponding to the EBD for<br>
Germany only, I used <code>auk</code>â€<img alt="™" src="https://s.w.org/images/core/emoji/11/72x72/2122.png" class="wp-smiley">s documentation and <a rel="nofollow" href="https://ropensci.org/blog/2018/08/07/auk/" target="_blank">this<br>
post</a> to learn how to process<br>
it. Since I wasnâ€<img alt="™" src="https://s.w.org/images/core/emoji/11/72x72/2122.png" class="wp-smiley">t planning on zero-filling the data to get<br>
presence/absence counts, I was able to ignore the sampling event data<br>
that contains the checklist-level information (e.g.Â time and date,<br>
location, and search effort information). For an example of a more<br>
advanced <code>auk</code> workflow involving the <strong>full</strong> EBD, and sampling data,<br>
refer to <a rel="nofollow" href="https://ropensci.org/blog/2018/08/07/auk/" target="_blank">Matt Strimas-Mackeyâ€<img alt="™" src="https://s.w.org/images/core/emoji/11/72x72/2122.png" class="wp-smiley">s own blog post about his<br>
package</a>.</p>
<h4>Preparing the dataset</h4>
<p>Here, the workflow is to <em>clean</em> the data and to <em>filter</em> it using one<br>
of <code>auk</code>â€<img alt="™" src="https://s.w.org/images/core/emoji/11/72x72/2122.png" class="wp-smiley">s built-in filters and then polygon filtering as earlier in<br>
this post. All steps are quite fast, because the custom dataset for<br>
Germany isnâ€<img alt="™" src="https://s.w.org/images/core/emoji/11/72x72/2122.png" class="wp-smiley">t too big (a few hundred megabytes).</p>
<p>Cleaning happens in the following:</p>
<pre><code>ebd_dir &lt;- &quot;C:/Users/Maelle/Documents/ropensci/ebird&quot;

f &lt;- file.path(ebd_dir, &quot;ebd_DE_relMay-2018.txt&quot;)
f_clean &lt;- file.path(ebd_dir, &quot;ebd_DE_relMay-2018_clean.txt&quot;)
auk::auk_clean(f, f_out = f_clean, remove_text = TRUE)
</code></pre>
<p>Then one can filter the data. Note that the <code>auk_extent</code> function that<br>
only retains observations within a bounding box has been renamed<br>
<code>auk_bbox</code> in the dev version of <code>auk</code>, the old name will be deprecated<br>
soon.</p>
<pre><code>ebd_dir &lt;- &quot;C:/Users/Maelle/Documents/ropensci/ebird&quot;
f_in_ebd &lt;- file.path(ebd_dir, &quot;ebd_DE_relMay-2018_clean.txt&quot;)

library(&quot;magrittr&quot;)
landkreis_konstanz_coords &lt;- sf::st_coordinates(landkreis_konstanz)

ebd_filter &lt;- auk::auk_ebd(f_in_ebd) %>% 
  auk::auk_extent(c(min(landkreis_konstanz_coords[, &quot;X&quot;]),
                    min(landkreis_konstanz_coords[, &quot;Y&quot;]), 
                    max(landkreis_konstanz_coords[, &quot;X&quot;]), 
                    max(landkreis_konstanz_coords[, &quot;Y&quot;])))
ebd_filter
</code></pre>
<pre><code>## Input 
##   EBD: C:\Users\Maelle\Documents\ropensci\ebird\ebd_DE_relMay-2018_clean.txt 
## 
## Output 
##   Filters not executed
## 
## Filters 
##   Species: all
##   Countries: all
##   States: all
##   BCRs: all
##   Spatial extent: Lon 8.6 - 9.2; Lat 47.7 - 47.9
##   Date: all
##   Start time: all
##   Last edited date: all
##   Protocol: all
##   Project code: all
##   Duration: all
##   Distance travelled: all
##   Records with breeding codes only: no
##   Complete checklists only: no
</code></pre>
<pre><code>fs::dir_create(&quot;ebird&quot;)
f_out_ebd &lt;- &quot;ebird/ebd_lk_konstanz.txt&quot;
f_out_sampling &lt;- &quot;ebird/ebd_lk_konstanz_sampling.txt&quot;
ebd_filtered &lt;- auk::auk_filter(ebd_filter, file = f_out_ebd,
                                overwrite = TRUE)
</code></pre>
<p>On top of this filtering with <code>auk</code>, after loading the data we filter<br>
observations inside the polygon of the county.</p>
<pre><code>crs &lt;- sf::st_crs(landkreis_konstanz)

ebd &lt;- auk::read_ebd(f_out_ebd) %>%
  sf::st_as_sf(coords = c(&quot;longitude&quot;, &quot;latitude&quot;), 
                crs = crs) 

in_indices &lt;- sf::st_within(ebd, landkreis_konstanz)

ebd &lt;- dplyr::filter(ebd, lengths(in_indices) > 0)

ebd &lt;- as.data.frame(ebd)
</code></pre>
<h4>What are the observed birds?</h4>
<p>Before looking at species names, letâ€<img alt="™" src="https://s.w.org/images/core/emoji/11/72x72/2122.png" class="wp-smiley">s have a brief look at the size and<br>
temporal extent of the data.</p>
<pre><code>library(&quot;ggplot2&quot;)

dim(ebd)
</code></pre>
<pre><code>## [1] 10156    41
</code></pre>
<pre><code>ebd %>%
  dplyr::mutate(year = lubridate::year(observation_date)) %>%
ggplot() +
  geom_bar(aes(year))  +
  hrbrthemes::theme_ipsum(base_size = 12, axis_title_size = 12, axis_text_size = 12) +
  ylab(&quot;No. of eBird observations&quot;) +
  xlab(&quot;Time (years)&quot;) +
  ggtitle(&quot;Full eBird dataset for the County of Constance&quot;)
</code></pre>
<p><img alt="No.Â of eBird observations over the
years" src="https://i2.wp.com/ropensci.org/img/blog-images/2018-08-21-birds-radolfzell/barplot-1.png?w=456&ssl=1" data-recalc-dims="1"></p>
<p>eBird started in 2002 but only became global in 2010. It allows people<br>
to enter older observations, though.</p>
<p>Now we can look at what birds have been reported the most.</p>
<pre><code>ebd %>%
  dplyr::filter(approved) %>%
  dplyr::count(scientific_name, common_name) %>%
  dplyr::arrange(- n) %>%
  head(n = 10) %>%
  knitr::kable()
</code></pre>
<table>
<thead>
<tr>
<th align="left">scientific_name</th>
<th align="left">common_name</th>
<th align="right">n</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">Corvus corone</td>
<td align="left">Carrion Crow</td>
<td align="right">288</td>
</tr>
<tr>
<td align="left">Turdus merula</td>
<td align="left">Eurasian Blackbird</td>
<td align="right">285</td>
</tr>
<tr>
<td align="left">Anas platyrhynchos</td>
<td align="left">Mallard</td>
<td align="right">273</td>
</tr>
<tr>
<td align="left">Fulica atra</td>
<td align="left">Eurasian Coot</td>
<td align="right">268</td>
</tr>
<tr>
<td align="left">Parus major</td>
<td align="left">Great Tit</td>
<td align="right">266</td>
</tr>
<tr>
<td align="left">Podiceps cristatus</td>
<td align="left">Great Crested Grebe</td>
<td align="right">254</td>
</tr>
<tr>
<td align="left">Ardea cinerea</td>
<td align="left">Gray Heron</td>
<td align="right">236</td>
</tr>
<tr>
<td align="left">Cygnus olor</td>
<td align="left">Mute Swan</td>
<td align="right">234</td>
</tr>
<tr>
<td align="left">Cyanistes caeruleus</td>
<td align="left">Eurasian Blue Tit</td>
<td align="right">233</td>
</tr>
<tr>
<td align="left">Chroicocephalus ridibundus</td>
<td align="left">Black-headed Gull</td>
<td align="right">223</td>
</tr>
</tbody>
</table>
<p>I had to google most of them, but only because I didnâ€<img alt="™" src="https://s.w.org/images/core/emoji/11/72x72/2122.png" class="wp-smiley">t know the<br>
scientific and English names of these birds: theyâ€<img alt="™" src="https://s.w.org/images/core/emoji/11/72x72/2122.png" class="wp-smiley">re birds even I, not a<br>
birder, know, probably because theyâ€<img alt="™" src="https://s.w.org/images/core/emoji/11/72x72/2122.png" class="wp-smiley">re also common in Brittany where I<br>
grew up.</p>
<p>We can also look at birds whose observation was rejected. Out of 10156<br>
observations only 64 were reviewed, and only 5 were not approved.</p>
<pre><code>ebd %>%
  dplyr::select(scientific_name, common_name,
               approved, reviewed, reason) %>%
  dplyr::filter(!approved) %>%
  knitr::kable()
</code></pre>
<table>
<thead>
<tr>
<th align="left">scientific_name</th>
<th align="left">common_name</th>
<th align="left">approved</th>
<th align="left">reviewed</th>
<th align="left">reason</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">Cygnus atratus</td>
<td align="left">Black Swan</td>
<td align="left">FALSE</td>
<td align="left">TRUE</td>
<td align="left">Species-Introduced/Exotic</td>
</tr>
<tr>
<td align="left">Cygnus atratus</td>
<td align="left">Black Swan</td>
<td align="left">FALSE</td>
<td align="left">TRUE</td>
<td align="left">Species-Introduced/Exotic</td>
</tr>
<tr>
<td align="left">Cygnus atratus</td>
<td align="left">Black Swan</td>
<td align="left">FALSE</td>
<td align="left">TRUE</td>
<td align="left">Species-Introduced/Exotic</td>
</tr>
<tr>
<td align="left">Oxyura leucocephala</td>
<td align="left">White-headed Duck</td>
<td align="left">FALSE</td>
<td align="left">TRUE</td>
<td align="left">Species-Introduced/Exotic</td>
</tr>
<tr>
<td align="left">Mareca sibilatrix</td>
<td align="left">Chiloe Wigeon</td>
<td align="left">FALSE</td>
<td align="left">TRUE</td>
<td align="left">Species-Introduced/Exotic</td>
</tr>
</tbody>
</table>
<p>Black Swans <a rel="nofollow" href="https://en.wikipedia.org/wiki/Black_swan" target="_blank">are mostly present in Australia, imported and escaped in a<br>
few other places</a> but eBird<br>
mostly doesnâ€<img alt="™" src="https://s.w.org/images/core/emoji/11/72x72/2122.png" class="wp-smiley">t accept the entry of exotic species <a rel="nofollow" href="https://help.ebird.org/customer/portal/questions/5390335-exclusion-of-not-native-birds-in-lists" target="_blank">although itâ€<img alt="™" src="https://s.w.org/images/core/emoji/11/72x72/2122.png" class="wp-smiley">s<br>
debated</a>.<br>
In any case, eBirdâ€<img alt="™" src="https://s.w.org/images/core/emoji/11/72x72/2122.png" class="wp-smiley">s curation of the data entered is quite admirable.</p>
<h4>Who observed birds?</h4>
<p>In <a rel="nofollow" href="https://recology.info/2018/06/butte-county/" target="_blank">one of his latest blog<br>
posts</a> Scott Chamberlain<br>
mentioned the legendary Lowell Ahart, super plant collector in Butte<br>
County, California. Does the county of Constance have a super birder?</p>
<pre><code>(first_birder &lt;- ebd %>%
  dplyr::count(observer_id) %>%
  dplyr::arrange(- n) %>%
  head(n = 1) )
</code></pre>
<pre><code>## # A tibble: 1 x 2
##   observer_id     n
##   </code></pre>