├── .editorconfig
├── .github
└── workflows
│ ├── README.md
│ ├── pr-close-signal.yaml
│ ├── pr-comment.yaml
│ ├── pr-post-remove-branch.yaml
│ ├── pr-preflight.yaml
│ ├── pr-receive.yaml
│ ├── sandpaper-main.yaml
│ ├── sandpaper-version.txt
│ ├── update-cache.yaml
│ └── update-workflows.yaml
├── .gitignore
├── .mailmap
├── .update-copyright.conf
├── .zenodo.json
├── AUTHORS
├── CITATION
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── CONTRIBUTORS.md
├── LICENSE.md
├── NEWS.md
├── README.md
├── config.yaml
├── episodes
├── 01-getting-started.md
├── 02-importing-data.md
├── 03-exploring-data.md
├── 04-transforming-data.md
├── 05-filter-exclude-sort.md
├── 06-reconciliation.md
├── 07-looking-up-data.md
├── 08-exporting-cleaning-steps.md
├── 09-exporting-data.md
├── 10-resources.md
├── data
│ └── Portal_rodents_19772002_simplified.csv
└── fig
│ ├── DC1_logo_small.png
│ ├── DataONE_LOGO.jpg
│ ├── creative-commons-attribution-license.png
│ ├── or362-clustering-result.png
│ ├── or362-clustering.png
│ ├── or362-data-from-url.png
│ ├── or362-facet-menu.png
│ ├── or362-faceted-scientificname.png
│ ├── or362-filter-scientificname.png
│ ├── or362-parse-json.png
│ ├── or362-plotid-tonumber.png
│ ├── or362-reconcile-add.png
│ ├── or362-reconcile-id.png
│ ├── or362-reconcile.png
│ ├── or362-undoredo.png
│ ├── or372-create-project.png
│ ├── or372-data-import.png
│ ├── or372-fetch-gbifjson.png
│ ├── or372-joincols.png
│ ├── or372-reconcile-results.png
│ └── or372-scatterplots.png
├── index.md
├── instructors
└── instructor-notes.md
├── learners
├── discuss.md
├── reference.md
└── setup.md
├── profiles
└── learner-profiles.md
└── site
└── README.md
/.editorconfig:
--------------------------------------------------------------------------------
1 | root = true
2 |
3 | [*]
4 | charset = utf-8
5 | insert_final_newline = true
6 | trim_trailing_whitespace = true
7 |
8 | [*.md]
9 | indent_size = 2
10 | indent_style = space
11 | max_line_length = 100 # Please keep this in sync with bin/lesson_check.py!
12 | trim_trailing_whitespace = false # keep trailing spaces in markdown - 2+ spaces are translated to a hard break (
)
13 |
14 | [*.r]
15 | max_line_length = 80
16 |
17 | [*.py]
18 | indent_size = 4
19 | indent_style = space
20 | max_line_length = 79
21 |
22 | [*.sh]
23 | end_of_line = lf
24 |
25 | [Makefile]
26 | indent_style = tab
27 |
--------------------------------------------------------------------------------
/.github/workflows/README.md:
--------------------------------------------------------------------------------
1 | # Carpentries Workflows
2 |
3 | This directory contains workflows to be used for Lessons using the {sandpaper}
4 | lesson infrastructure. Two of these workflows require R (`sandpaper-main.yaml`
5 | and `pr-receive.yaml`) and the rest are bots to handle pull request management.
6 |
7 | These workflows will likely change as {sandpaper} evolves, so it is important to
8 | keep them up-to-date. To do this in your lesson you can do the following in your
9 | R console:
10 |
11 | ```r
12 | # Install/Update sandpaper
13 | options(repos = c(carpentries = "https://carpentries.r-universe.dev/",
14 | CRAN = "https://cloud.r-project.org"))
15 | install.packages("sandpaper")
16 |
17 | # update the workflows in your lesson
18 | library("sandpaper")
19 | update_github_workflows()
20 | ```
21 |
22 | Inside this folder, you will find a file called `sandpaper-version.txt`, which
23 | will contain a version number for sandpaper. This will be used in the future to
24 | alert you if a workflow update is needed.
25 |
26 | What follows are the descriptions of the workflow files:
27 |
28 | ## Deployment
29 |
30 | ### 01 Build and Deploy (sandpaper-main.yaml)
31 |
32 | This is the main driver that will only act on the main branch of the repository.
33 | This workflow does the following:
34 |
35 | 1. checks out the lesson
36 | 2. provisions the following resources
37 | - R
38 | - pandoc
39 | - lesson infrastructure (stored in a cache)
40 | - lesson dependencies if needed (stored in a cache)
41 | 3. builds the lesson via `sandpaper:::ci_deploy()`
42 |
43 | #### Caching
44 |
45 | This workflow has two caches; one cache is for the lesson infrastructure and
46 | the other is for the lesson dependencies if the lesson contains rendered
47 | content. These caches are invalidated by new versions of the infrastructure and
48 | the `renv.lock` file, respectively. If there is a problem with the cache,
49 | manual invaliation is necessary. You will need maintain access to the repository
50 | and you can either go to the actions tab and [click on the caches button to find
51 | and invalidate the failing cache](https://github.blog/changelog/2022-10-20-manage-caches-in-your-actions-workflows-from-web-interface/)
52 | or by setting the `CACHE_VERSION` secret to the current date (which will
53 | invalidate all of the caches).
54 |
55 | ## Updates
56 |
57 | ### Setup Information
58 |
59 | These workflows run on a schedule and at the maintainer's request. Because they
60 | create pull requests that update workflows/require the downstream actions to run,
61 | they need a special repository/organization secret token called
62 | `SANDPAPER_WORKFLOW` and it must have the `public_repo` and `workflow` scope.
63 |
64 | This can be an individual user token, OR it can be a trusted bot account. If you
65 | have a repository in one of the official Carpentries accounts, then you do not
66 | need to worry about this token being present because the Carpentries Core Team
67 | will take care of supplying this token.
68 |
69 | If you want to use your personal account: you can go to
70 |
71 | to create a token. Once you have created your token, you should copy it to your
72 | clipboard and then go to your repository's settings > secrets > actions and
73 | create or edit the `SANDPAPER_WORKFLOW` secret, pasting in the generated token.
74 |
75 | If you do not specify your token correctly, the runs will not fail and they will
76 | give you instructions to provide the token for your repository.
77 |
78 | ### 02 Maintain: Update Workflow Files (update-workflow.yaml)
79 |
80 | The {sandpaper} repository was designed to do as much as possible to separate
81 | the tools from the content. For local builds, this is absolutely true, but
82 | there is a minor issue when it comes to workflow files: they must live inside
83 | the repository.
84 |
85 | This workflow ensures that the workflow files are up-to-date. The way it work is
86 | to download the update-workflows.sh script from GitHub and run it. The script
87 | will do the following:
88 |
89 | 1. check the recorded version of sandpaper against the current version on github
90 | 2. update the files if there is a difference in versions
91 |
92 | After the files are updated, if there are any changes, they are pushed to a
93 | branch called `update/workflows` and a pull request is created. Maintainers are
94 | encouraged to review the changes and accept the pull request if the outputs
95 | are okay.
96 |
97 | This update is run weekly or on demand.
98 |
99 | ### 03 Maintain: Update Package Cache (update-cache.yaml)
100 |
101 | For lessons that have generated content, we use {renv} to ensure that the output
102 | is stable. This is controlled by a single lockfile which documents the packages
103 | needed for the lesson and the version numbers. This workflow is skipped in
104 | lessons that do not have generated content.
105 |
106 | Because the lessons need to remain current with the package ecosystem, it's a
107 | good idea to make sure these packages can be updated periodically. The
108 | update cache workflow will do this by checking for updates, applying them in a
109 | branch called `updates/packages` and creating a pull request with _only the
110 | lockfile changed_.
111 |
112 | From here, the markdown documents will be rebuilt and you can inspect what has
113 | changed based on how the packages have updated.
114 |
115 | ## Pull Request and Review Management
116 |
117 | Because our lessons execute code, pull requests are a secruity risk for any
118 | lesson and thus have security measures associted with them. **Do not merge any
119 | pull requests that do not pass checks and do not have bots commented on them.**
120 |
121 | This series of workflows all go together and are described in the following
122 | diagram and the below sections:
123 |
124 | 
125 |
126 | ### Pre Flight Pull Request Validation (pr-preflight.yaml)
127 |
128 | This workflow runs every time a pull request is created and its purpose is to
129 | validate that the pull request is okay to run. This means the following things:
130 |
131 | 1. The pull request does not contain modified workflow files
132 | 2. If the pull request contains modified workflow files, it does not contain
133 | modified content files (such as a situation where @carpentries-bot will
134 | make an automated pull request)
135 | 3. The pull request does not contain an invalid commit hash (e.g. from a fork
136 | that was made before a lesson was transitioned from styles to use the
137 | workbench).
138 |
139 | Once the checks are finished, a comment is issued to the pull request, which
140 | will allow maintainers to determine if it is safe to run the
141 | "Receive Pull Request" workflow from new contributors.
142 |
143 | ### Receive Pull Request (pr-receive.yaml)
144 |
145 | **Note of caution:** This workflow runs arbitrary code by anyone who creates a
146 | pull request. GitHub has safeguarded the token used in this workflow to have no
147 | priviledges in the repository, but we have taken precautions to protect against
148 | spoofing.
149 |
150 | This workflow is triggered with every push to a pull request. If this workflow
151 | is already running and a new push is sent to the pull request, the workflow
152 | running from the previous push will be cancelled and a new workflow run will be
153 | started.
154 |
155 | The first step of this workflow is to check if it is valid (e.g. that no
156 | workflow files have been modified). If there are workflow files that have been
157 | modified, a comment is made that indicates that the workflow is not run. If
158 | both a workflow file and lesson content is modified, an error will occurr.
159 |
160 | The second step (if valid) is to build the generated content from the pull
161 | request. This builds the content and uploads three artifacts:
162 |
163 | 1. The pull request number (pr)
164 | 2. A summary of changes after the rendering process (diff)
165 | 3. The rendered files (build)
166 |
167 | Because this workflow builds generated content, it follows the same general
168 | process as the `sandpaper-main` workflow with the same caching mechanisms.
169 |
170 | The artifacts produced are used by the next workflow.
171 |
172 | ### Comment on Pull Request (pr-comment.yaml)
173 |
174 | This workflow is triggered if the `pr-receive.yaml` workflow is successful.
175 | The steps in this workflow are:
176 |
177 | 1. Test if the workflow is valid and comment the validity of the workflow to the
178 | pull request.
179 | 2. If it is valid: create an orphan branch with two commits: the current state
180 | of the repository and the proposed changes.
181 | 3. If it is valid: update the pull request comment with the summary of changes
182 |
183 | Importantly: if the pull request is invalid, the branch is not created so any
184 | malicious code is not published.
185 |
186 | From here, the maintainer can request changes from the author and eventually
187 | either merge or reject the PR. When this happens, if the PR was valid, the
188 | preview branch needs to be deleted.
189 |
190 | ### Send Close PR Signal (pr-close-signal.yaml)
191 |
192 | Triggered any time a pull request is closed. This emits an artifact that is the
193 | pull request number for the next action
194 |
195 | ### Remove Pull Request Branch (pr-post-remove-branch.yaml)
196 |
197 | Tiggered by `pr-close-signal.yaml`. This removes the temporary branch associated with
198 | the pull request (if it was created).
199 |
--------------------------------------------------------------------------------
/.github/workflows/pr-close-signal.yaml:
--------------------------------------------------------------------------------
1 | name: "Bot: Send Close Pull Request Signal"
2 |
3 | on:
4 | pull_request:
5 | types:
6 | [closed]
7 |
8 | jobs:
9 | send-close-signal:
10 | name: "Send closing signal"
11 | runs-on: ubuntu-22.04
12 | if: ${{ github.event.action == 'closed' }}
13 | steps:
14 | - name: "Create PRtifact"
15 | run: |
16 | mkdir -p ./pr
17 | printf ${{ github.event.number }} > ./pr/NUM
18 | - name: Upload Diff
19 | uses: actions/upload-artifact@v4
20 | with:
21 | name: pr
22 | path: ./pr
23 |
--------------------------------------------------------------------------------
/.github/workflows/pr-comment.yaml:
--------------------------------------------------------------------------------
1 | name: "Bot: Comment on the Pull Request"
2 |
3 | # read-write repo token
4 | # access to secrets
5 | on:
6 | workflow_run:
7 | workflows: ["Receive Pull Request"]
8 | types:
9 | - completed
10 |
11 | concurrency:
12 | group: pr-${{ github.event.workflow_run.pull_requests[0].number }}
13 | cancel-in-progress: true
14 |
15 |
16 | jobs:
17 | # Pull requests are valid if:
18 | # - they match the sha of the workflow run head commit
19 | # - they are open
20 | # - no .github files were committed
21 | test-pr:
22 | name: "Test if pull request is valid"
23 | runs-on: ubuntu-22.04
24 | if: >
25 | github.event.workflow_run.event == 'pull_request' &&
26 | github.event.workflow_run.conclusion == 'success'
27 | outputs:
28 | is_valid: ${{ steps.check-pr.outputs.VALID }}
29 | payload: ${{ steps.check-pr.outputs.payload }}
30 | number: ${{ steps.get-pr.outputs.NUM }}
31 | msg: ${{ steps.check-pr.outputs.MSG }}
32 | steps:
33 | - name: 'Download PR artifact'
34 | id: dl
35 | uses: carpentries/actions/download-workflow-artifact@main
36 | with:
37 | run: ${{ github.event.workflow_run.id }}
38 | name: 'pr'
39 |
40 | - name: "Get PR Number"
41 | if: ${{ steps.dl.outputs.success == 'true' }}
42 | id: get-pr
43 | run: |
44 | unzip pr.zip
45 | echo "NUM=$(<./NR)" >> $GITHUB_OUTPUT
46 |
47 | - name: "Fail if PR number was not present"
48 | id: bad-pr
49 | if: ${{ steps.dl.outputs.success != 'true' }}
50 | run: |
51 | echo '::error::A pull request number was not recorded. The pull request that triggered this workflow is likely malicious.'
52 | exit 1
53 | - name: "Get Invalid Hashes File"
54 | id: hash
55 | run: |
56 | echo "json<> $GITHUB_OUTPUT
59 | - name: "Check PR"
60 | id: check-pr
61 | if: ${{ steps.dl.outputs.success == 'true' }}
62 | uses: carpentries/actions/check-valid-pr@main
63 | with:
64 | pr: ${{ steps.get-pr.outputs.NUM }}
65 | sha: ${{ github.event.workflow_run.head_sha }}
66 | headroom: 3 # if it's within the last three commits, we can keep going, because it's likely rapid-fire
67 | invalid: ${{ fromJSON(steps.hash.outputs.json)[github.repository] }}
68 | fail_on_error: true
69 |
70 | # Create an orphan branch on this repository with two commits
71 | # - the current HEAD of the md-outputs branch
72 | # - the output from running the current HEAD of the pull request through
73 | # the md generator
74 | create-branch:
75 | name: "Create Git Branch"
76 | needs: test-pr
77 | runs-on: ubuntu-22.04
78 | if: ${{ needs.test-pr.outputs.is_valid == 'true' }}
79 | env:
80 | NR: ${{ needs.test-pr.outputs.number }}
81 | permissions:
82 | contents: write
83 | steps:
84 | - name: 'Checkout md outputs'
85 | uses: actions/checkout@v4
86 | with:
87 | ref: md-outputs
88 | path: built
89 | fetch-depth: 1
90 |
91 | - name: 'Download built markdown'
92 | id: dl
93 | uses: carpentries/actions/download-workflow-artifact@main
94 | with:
95 | run: ${{ github.event.workflow_run.id }}
96 | name: 'built'
97 |
98 | - if: ${{ steps.dl.outputs.success == 'true' }}
99 | run: unzip built.zip
100 |
101 | - name: "Create orphan and push"
102 | if: ${{ steps.dl.outputs.success == 'true' }}
103 | run: |
104 | cd built/
105 | git config --local user.email "actions@github.com"
106 | git config --local user.name "GitHub Actions"
107 | CURR_HEAD=$(git rev-parse HEAD)
108 | git checkout --orphan md-outputs-PR-${NR}
109 | git add -A
110 | git commit -m "source commit: ${CURR_HEAD}"
111 | ls -A | grep -v '^.git$' | xargs -I _ rm -r '_'
112 | cd ..
113 | unzip -o -d built built.zip
114 | cd built
115 | git add -A
116 | git commit --allow-empty -m "differences for PR #${NR}"
117 | git push -u --force --set-upstream origin md-outputs-PR-${NR}
118 |
119 | # Comment on the Pull Request with a link to the branch and the diff
120 | comment-pr:
121 | name: "Comment on Pull Request"
122 | needs: [test-pr, create-branch]
123 | runs-on: ubuntu-22.04
124 | if: ${{ needs.test-pr.outputs.is_valid == 'true' }}
125 | env:
126 | NR: ${{ needs.test-pr.outputs.number }}
127 | permissions:
128 | pull-requests: write
129 | steps:
130 | - name: 'Download comment artifact'
131 | id: dl
132 | uses: carpentries/actions/download-workflow-artifact@main
133 | with:
134 | run: ${{ github.event.workflow_run.id }}
135 | name: 'diff'
136 |
137 | - if: ${{ steps.dl.outputs.success == 'true' }}
138 | run: unzip ${{ github.workspace }}/diff.zip
139 |
140 | - name: "Comment on PR"
141 | id: comment-diff
142 | if: ${{ steps.dl.outputs.success == 'true' }}
143 | uses: carpentries/actions/comment-diff@main
144 | with:
145 | pr: ${{ env.NR }}
146 | path: ${{ github.workspace }}/diff.md
147 |
148 | # Comment if the PR is open and matches the SHA, but the workflow files have
149 | # changed
150 | comment-changed-workflow:
151 | name: "Comment if workflow files have changed"
152 | needs: test-pr
153 | runs-on: ubuntu-22.04
154 | if: ${{ always() && needs.test-pr.outputs.is_valid == 'false' }}
155 | env:
156 | NR: ${{ github.event.workflow_run.pull_requests[0].number }}
157 | body: ${{ needs.test-pr.outputs.msg }}
158 | permissions:
159 | pull-requests: write
160 | steps:
161 | - name: 'Check for spoofing'
162 | id: dl
163 | uses: carpentries/actions/download-workflow-artifact@main
164 | with:
165 | run: ${{ github.event.workflow_run.id }}
166 | name: 'built'
167 |
168 | - name: 'Alert if spoofed'
169 | id: spoof
170 | if: ${{ steps.dl.outputs.success == 'true' }}
171 | run: |
172 | echo 'body<> $GITHUB_ENV
173 | echo '' >> $GITHUB_ENV
174 | echo '## :x: DANGER :x:' >> $GITHUB_ENV
175 | echo 'This pull request has modified workflows that created output. Close this now.' >> $GITHUB_ENV
176 | echo '' >> $GITHUB_ENV
177 | echo 'EOF' >> $GITHUB_ENV
178 |
179 | - name: "Comment on PR"
180 | id: comment-diff
181 | uses: carpentries/actions/comment-diff@main
182 | with:
183 | pr: ${{ env.NR }}
184 | body: ${{ env.body }}
185 |
--------------------------------------------------------------------------------
/.github/workflows/pr-post-remove-branch.yaml:
--------------------------------------------------------------------------------
1 | name: "Bot: Remove Temporary PR Branch"
2 |
3 | on:
4 | workflow_run:
5 | workflows: ["Bot: Send Close Pull Request Signal"]
6 | types:
7 | - completed
8 |
9 | jobs:
10 | delete:
11 | name: "Delete branch from Pull Request"
12 | runs-on: ubuntu-22.04
13 | if: >
14 | github.event.workflow_run.event == 'pull_request' &&
15 | github.event.workflow_run.conclusion == 'success'
16 | permissions:
17 | contents: write
18 | steps:
19 | - name: 'Download artifact'
20 | uses: carpentries/actions/download-workflow-artifact@main
21 | with:
22 | run: ${{ github.event.workflow_run.id }}
23 | name: pr
24 | - name: "Get PR Number"
25 | id: get-pr
26 | run: |
27 | unzip pr.zip
28 | echo "NUM=$(<./NUM)" >> $GITHUB_OUTPUT
29 | - name: 'Remove branch'
30 | uses: carpentries/actions/remove-branch@main
31 | with:
32 | pr: ${{ steps.get-pr.outputs.NUM }}
33 |
--------------------------------------------------------------------------------
/.github/workflows/pr-preflight.yaml:
--------------------------------------------------------------------------------
1 | name: "Pull Request Preflight Check"
2 |
3 | on:
4 | pull_request_target:
5 | branches:
6 | ["main"]
7 | types:
8 | ["opened", "synchronize", "reopened"]
9 |
10 | jobs:
11 | test-pr:
12 | name: "Test if pull request is valid"
13 | if: ${{ github.event.action != 'closed' }}
14 | runs-on: ubuntu-22.04
15 | outputs:
16 | is_valid: ${{ steps.check-pr.outputs.VALID }}
17 | permissions:
18 | pull-requests: write
19 | steps:
20 | - name: "Get Invalid Hashes File"
21 | id: hash
22 | run: |
23 | echo "json<> $GITHUB_OUTPUT
26 | - name: "Check PR"
27 | id: check-pr
28 | uses: carpentries/actions/check-valid-pr@main
29 | with:
30 | pr: ${{ github.event.number }}
31 | invalid: ${{ fromJSON(steps.hash.outputs.json)[github.repository] }}
32 | fail_on_error: true
33 | - name: "Comment result of validation"
34 | id: comment-diff
35 | if: ${{ always() }}
36 | uses: carpentries/actions/comment-diff@main
37 | with:
38 | pr: ${{ github.event.number }}
39 | body: ${{ steps.check-pr.outputs.MSG }}
40 |
--------------------------------------------------------------------------------
/.github/workflows/pr-receive.yaml:
--------------------------------------------------------------------------------
1 | name: "Receive Pull Request"
2 |
3 | on:
4 | pull_request:
5 | types:
6 | [opened, synchronize, reopened]
7 |
8 | concurrency:
9 | group: ${{ github.ref }}
10 | cancel-in-progress: true
11 |
12 | jobs:
13 | test-pr:
14 | name: "Record PR number"
15 | if: ${{ github.event.action != 'closed' }}
16 | runs-on: ubuntu-22.04
17 | outputs:
18 | is_valid: ${{ steps.check-pr.outputs.VALID }}
19 | steps:
20 | - name: "Record PR number"
21 | id: record
22 | if: ${{ always() }}
23 | run: |
24 | echo ${{ github.event.number }} > ${{ github.workspace }}/NR # 2022-03-02: artifact name fixed to be NR
25 | - name: "Upload PR number"
26 | id: upload
27 | if: ${{ always() }}
28 | uses: actions/upload-artifact@v4
29 | with:
30 | name: pr
31 | path: ${{ github.workspace }}/NR
32 | - name: "Get Invalid Hashes File"
33 | id: hash
34 | run: |
35 | echo "json<> $GITHUB_OUTPUT
38 | - name: "echo output"
39 | run: |
40 | echo "${{ steps.hash.outputs.json }}"
41 | - name: "Check PR"
42 | id: check-pr
43 | uses: carpentries/actions/check-valid-pr@main
44 | with:
45 | pr: ${{ github.event.number }}
46 | invalid: ${{ fromJSON(steps.hash.outputs.json)[github.repository] }}
47 |
48 | build-md-source:
49 | name: "Build markdown source files if valid"
50 | needs: test-pr
51 | runs-on: ubuntu-22.04
52 | if: ${{ needs.test-pr.outputs.is_valid == 'true' }}
53 | env:
54 | GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }}
55 | RENV_PATHS_ROOT: ~/.local/share/renv/
56 | CHIVE: ${{ github.workspace }}/site/chive
57 | PR: ${{ github.workspace }}/site/pr
58 | MD: ${{ github.workspace }}/site/built
59 | steps:
60 | - name: "Check Out Main Branch"
61 | uses: actions/checkout@v4
62 |
63 | - name: "Check Out Staging Branch"
64 | uses: actions/checkout@v4
65 | with:
66 | ref: md-outputs
67 | path: ${{ env.MD }}
68 |
69 | - name: "Set up R"
70 | uses: r-lib/actions/setup-r@v2
71 | with:
72 | use-public-rspm: true
73 | install-r: false
74 |
75 | - name: "Set up Pandoc"
76 | uses: r-lib/actions/setup-pandoc@v2
77 |
78 | - name: "Setup Lesson Engine"
79 | uses: carpentries/actions/setup-sandpaper@main
80 | with:
81 | cache-version: ${{ secrets.CACHE_VERSION }}
82 |
83 | - name: "Setup Package Cache"
84 | uses: carpentries/actions/setup-lesson-deps@main
85 | with:
86 | cache-version: ${{ secrets.CACHE_VERSION }}
87 |
88 | - name: "Validate and Build Markdown"
89 | id: build-site
90 | run: |
91 | sandpaper::package_cache_trigger(TRUE)
92 | sandpaper::validate_lesson(path = '${{ github.workspace }}')
93 | sandpaper:::build_markdown(path = '${{ github.workspace }}', quiet = FALSE)
94 | shell: Rscript {0}
95 |
96 | - name: "Generate Artifacts"
97 | id: generate-artifacts
98 | run: |
99 | sandpaper:::ci_bundle_pr_artifacts(
100 | repo = '${{ github.repository }}',
101 | pr_number = '${{ github.event.number }}',
102 | path_md = '${{ env.MD }}',
103 | path_pr = '${{ env.PR }}',
104 | path_archive = '${{ env.CHIVE }}',
105 | branch = 'md-outputs'
106 | )
107 | shell: Rscript {0}
108 |
109 | - name: "Upload PR"
110 | uses: actions/upload-artifact@v4
111 | with:
112 | name: pr
113 | path: ${{ env.PR }}
114 | overwrite: true
115 |
116 | - name: "Upload Diff"
117 | uses: actions/upload-artifact@v4
118 | with:
119 | name: diff
120 | path: ${{ env.CHIVE }}
121 | retention-days: 1
122 |
123 | - name: "Upload Build"
124 | uses: actions/upload-artifact@v4
125 | with:
126 | name: built
127 | path: ${{ env.MD }}
128 | retention-days: 1
129 |
130 | - name: "Teardown"
131 | run: sandpaper::reset_site()
132 | shell: Rscript {0}
133 |
--------------------------------------------------------------------------------
/.github/workflows/sandpaper-main.yaml:
--------------------------------------------------------------------------------
1 | name: "01 Build and Deploy Site"
2 |
3 | on:
4 | push:
5 | branches:
6 | - main
7 | - master
8 | schedule:
9 | - cron: '0 0 * * 2'
10 | workflow_dispatch:
11 | inputs:
12 | name:
13 | description: 'Who triggered this build?'
14 | required: true
15 | default: 'Maintainer (via GitHub)'
16 | reset:
17 | description: 'Reset cached markdown files'
18 | required: false
19 | default: false
20 | type: boolean
21 | jobs:
22 | full-build:
23 | name: "Build Full Site"
24 |
25 | # 2024-10-01: ubuntu-latest is now 24.04 and R is not installed by default in the runner image
26 | # pin to 22.04 for now
27 | runs-on: ubuntu-22.04
28 | permissions:
29 | checks: write
30 | contents: write
31 | pages: write
32 | env:
33 | GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }}
34 | RENV_PATHS_ROOT: ~/.local/share/renv/
35 | steps:
36 |
37 | - name: "Checkout Lesson"
38 | uses: actions/checkout@v4
39 |
40 | - name: "Set up R"
41 | uses: r-lib/actions/setup-r@v2
42 | with:
43 | use-public-rspm: true
44 | install-r: false
45 |
46 | - name: "Set up Pandoc"
47 | uses: r-lib/actions/setup-pandoc@v2
48 |
49 | - name: "Setup Lesson Engine"
50 | uses: carpentries/actions/setup-sandpaper@main
51 | with:
52 | cache-version: ${{ secrets.CACHE_VERSION }}
53 |
54 | - name: "Setup Package Cache"
55 | uses: carpentries/actions/setup-lesson-deps@main
56 | with:
57 | cache-version: ${{ secrets.CACHE_VERSION }}
58 |
59 | - name: "Deploy Site"
60 | run: |
61 | reset <- "${{ github.event.inputs.reset }}" == "true"
62 | sandpaper::package_cache_trigger(TRUE)
63 | sandpaper:::ci_deploy(reset = reset)
64 | shell: Rscript {0}
65 |
--------------------------------------------------------------------------------
/.github/workflows/sandpaper-version.txt:
--------------------------------------------------------------------------------
1 | 0.16.12
2 |
--------------------------------------------------------------------------------
/.github/workflows/update-cache.yaml:
--------------------------------------------------------------------------------
1 | name: "03 Maintain: Update Package Cache"
2 |
3 | on:
4 | workflow_dispatch:
5 | inputs:
6 | name:
7 | description: 'Who triggered this build (enter github username to tag yourself)?'
8 | required: true
9 | default: 'monthly run'
10 | schedule:
11 | # Run every tuesday
12 | - cron: '0 0 * * 2'
13 |
14 | jobs:
15 | preflight:
16 | name: "Preflight Check"
17 | runs-on: ubuntu-22.04
18 | outputs:
19 | ok: ${{ steps.check.outputs.ok }}
20 | steps:
21 | - id: check
22 | run: |
23 | if [[ ${{ github.event_name }} == 'workflow_dispatch' ]]; then
24 | echo "ok=true" >> $GITHUB_OUTPUT
25 | echo "Running on request"
26 | # using single brackets here to avoid 08 being interpreted as octal
27 | # https://github.com/carpentries/sandpaper/issues/250
28 | elif [ `date +%d` -le 7 ]; then
29 | # If the Tuesday lands in the first week of the month, run it
30 | echo "ok=true" >> $GITHUB_OUTPUT
31 | echo "Running on schedule"
32 | else
33 | echo "ok=false" >> $GITHUB_OUTPUT
34 | echo "Not Running Today"
35 | fi
36 |
37 | check_renv:
38 | name: "Check if We Need {renv}"
39 | runs-on: ubuntu-22.04
40 | needs: preflight
41 | if: ${{ needs.preflight.outputs.ok == 'true'}}
42 | outputs:
43 | needed: ${{ steps.renv.outputs.exists }}
44 | steps:
45 | - name: "Checkout Lesson"
46 | uses: actions/checkout@v4
47 | - id: renv
48 | run: |
49 | if [[ -d renv ]]; then
50 | echo "exists=true" >> $GITHUB_OUTPUT
51 | fi
52 |
53 | check_token:
54 | name: "Check SANDPAPER_WORKFLOW token"
55 | runs-on: ubuntu-22.04
56 | needs: check_renv
57 | if: ${{ needs.check_renv.outputs.needed == 'true' }}
58 | outputs:
59 | workflow: ${{ steps.validate.outputs.wf }}
60 | repo: ${{ steps.validate.outputs.repo }}
61 | steps:
62 | - name: "validate token"
63 | id: validate
64 | uses: carpentries/actions/check-valid-credentials@main
65 | with:
66 | token: ${{ secrets.SANDPAPER_WORKFLOW }}
67 |
68 | update_cache:
69 | name: "Update Package Cache"
70 | needs: check_token
71 | if: ${{ needs.check_token.outputs.repo== 'true' }}
72 | runs-on: ubuntu-22.04
73 | env:
74 | GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }}
75 | RENV_PATHS_ROOT: ~/.local/share/renv/
76 | steps:
77 |
78 | - name: "Checkout Lesson"
79 | uses: actions/checkout@v4
80 |
81 | - name: "Set up R"
82 | uses: r-lib/actions/setup-r@v2
83 | with:
84 | use-public-rspm: true
85 | install-r: false
86 |
87 | - name: "Update {renv} deps and determine if a PR is needed"
88 | id: update
89 | uses: carpentries/actions/update-lockfile@main
90 | with:
91 | cache-version: ${{ secrets.CACHE_VERSION }}
92 |
93 | - name: Create Pull Request
94 | id: cpr
95 | if: ${{ steps.update.outputs.n > 0 }}
96 | uses: carpentries/create-pull-request@main
97 | with:
98 | token: ${{ secrets.SANDPAPER_WORKFLOW }}
99 | delete-branch: true
100 | branch: "update/packages"
101 | commit-message: "[actions] update ${{ steps.update.outputs.n }} packages"
102 | title: "Update ${{ steps.update.outputs.n }} packages"
103 | body: |
104 | :robot: This is an automated build
105 |
106 | This will update ${{ steps.update.outputs.n }} packages in your lesson with the following versions:
107 |
108 | ```
109 | ${{ steps.update.outputs.report }}
110 | ```
111 |
112 | :stopwatch: In a few minutes, a comment will appear that will show you how the output has changed based on these updates.
113 |
114 | If you want to inspect these changes locally, you can use the following code to check out a new branch:
115 |
116 | ```bash
117 | git fetch origin update/packages
118 | git checkout update/packages
119 | ```
120 |
121 | - Auto-generated by [create-pull-request][1] on ${{ steps.update.outputs.date }}
122 |
123 | [1]: https://github.com/carpentries/create-pull-request/tree/main
124 | labels: "type: package cache"
125 | draft: false
126 |
--------------------------------------------------------------------------------
/.github/workflows/update-workflows.yaml:
--------------------------------------------------------------------------------
1 | name: "02 Maintain: Update Workflow Files"
2 |
3 | on:
4 | workflow_dispatch:
5 | inputs:
6 | name:
7 | description: 'Who triggered this build (enter github username to tag yourself)?'
8 | required: true
9 | default: 'weekly run'
10 | clean:
11 | description: 'Workflow files/file extensions to clean (no wildcards, enter "" for none)'
12 | required: false
13 | default: '.yaml'
14 | schedule:
15 | # Run every Tuesday
16 | - cron: '0 0 * * 2'
17 |
18 | jobs:
19 | check_token:
20 | name: "Check SANDPAPER_WORKFLOW token"
21 | runs-on: ubuntu-22.04
22 | outputs:
23 | workflow: ${{ steps.validate.outputs.wf }}
24 | repo: ${{ steps.validate.outputs.repo }}
25 | steps:
26 | - name: "validate token"
27 | id: validate
28 | uses: carpentries/actions/check-valid-credentials@main
29 | with:
30 | token: ${{ secrets.SANDPAPER_WORKFLOW }}
31 |
32 | update_workflow:
33 | name: "Update Workflow"
34 | runs-on: ubuntu-22.04
35 | needs: check_token
36 | if: ${{ needs.check_token.outputs.workflow == 'true' }}
37 | steps:
38 | - name: "Checkout Repository"
39 | uses: actions/checkout@v4
40 |
41 | - name: Update Workflows
42 | id: update
43 | uses: carpentries/actions/update-workflows@main
44 | with:
45 | clean: ${{ github.event.inputs.clean }}
46 |
47 | - name: Create Pull Request
48 | id: cpr
49 | if: "${{ steps.update.outputs.new }}"
50 | uses: carpentries/create-pull-request@main
51 | with:
52 | token: ${{ secrets.SANDPAPER_WORKFLOW }}
53 | delete-branch: true
54 | branch: "update/workflows"
55 | commit-message: "[actions] update sandpaper workflow to version ${{ steps.update.outputs.new }}"
56 | title: "Update Workflows to Version ${{ steps.update.outputs.new }}"
57 | body: |
58 | :robot: This is an automated build
59 |
60 | Update Workflows from sandpaper version ${{ steps.update.outputs.old }} -> ${{ steps.update.outputs.new }}
61 |
62 | - Auto-generated by [create-pull-request][1] on ${{ steps.update.outputs.date }}
63 |
64 | [1]: https://github.com/carpentries/create-pull-request/tree/main
65 | labels: "type: template and tools"
66 | draft: false
67 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # sandpaper files
2 | episodes/*html
3 | site/*
4 | !site/README.md
5 |
6 | # History files
7 | .Rhistory
8 | .Rapp.history
9 | # Session Data files
10 | .RData
11 | # User-specific files
12 | .Ruserdata
13 | # Example code in package build process
14 | *-Ex.R
15 | # Output files from R CMD build
16 | /*.tar.gz
17 | # Output files from R CMD check
18 | /*.Rcheck/
19 | # RStudio files
20 | .Rproj.user/
21 | # produced vignettes
22 | vignettes/*.html
23 | vignettes/*.pdf
24 | # OAuth2 token, see https://github.com/hadley/httr/releases/tag/v0.3
25 | .httr-oauth
26 | # knitr and R markdown default cache directories
27 | *_cache/
28 | /cache/
29 | # Temporary files created by R markdown
30 | *.utf8.md
31 | *.knit.md
32 | # R Environment Variables
33 | .Renviron
34 | # pkgdown site
35 | docs/
36 | # translation temp files
37 | po/*~
38 | # renv detritus
39 | renv/sandbox/
40 | *.pyc
41 | *~
42 | .DS_Store
43 | .ipynb_checkpoints
44 | .sass-cache
45 | .jekyll-cache/
46 | .jekyll-metadata
47 | __pycache__
48 | _site
49 | .Rproj.user
50 | .bundle/
51 | .vendor/
52 | vendor/
53 | .docker-vendor/
54 | Gemfile.lock
55 | .*history
56 | *.Rproj
57 |
--------------------------------------------------------------------------------
/.mailmap:
--------------------------------------------------------------------------------
1 | Abigail Cabunoc
2 | Erin Becker ErinBecker
3 | Francois Michonneau
4 | Greg Wilson
5 | Nick Young
6 | Raniere Silva
7 | Raniere Silva
8 | Rémi Emonet
9 | Tracy Teal
10 | April M. Wright
11 | Lisa Zilinski
12 | Ryan E. Johnson
13 | Jessica Trelogan
--------------------------------------------------------------------------------
/.update-copyright.conf:
--------------------------------------------------------------------------------
1 | [project]
2 | vcs: Git
3 |
4 | [files]
5 | authors: yes
6 | files: no
7 |
--------------------------------------------------------------------------------
/.zenodo.json:
--------------------------------------------------------------------------------
1 | {
2 | "contributors": [
3 | {
4 | "type": "Editor",
5 | "name": "Luis J Villanueva"
6 | }
7 | ],
8 | "creators": [
9 | {
10 | "name": "Luis J Villanueva"
11 | },
12 | {
13 | "name": "Phillip Doehle",
14 | "orcid": "0000-0002-3006-0683"
15 | },
16 | {
17 | "name": "Dorothea Salo"
18 | },
19 | {
20 | "name": "Maneesha Sane"
21 | },
22 | {
23 | "name": "Debbie Paul"
24 | },
25 | {
26 | "name": "Jeanine Finn"
27 | },
28 | {
29 | "name": "JoshuaDull"
30 | },
31 | {
32 | "name": "David LeBauer"
33 | },
34 | {
35 | "name": "Dr. Kari L. Jordan",
36 | "orcid": "0000-0003-4121-2432"
37 | },
38 | {
39 | "name": "Nicola Soranzo",
40 | "orcid": "0000-0003-3627-5340"
41 | },
42 | {
43 | "name": "Paul R. Pival",
44 | "orcid": "0000-0002-1685-0590"
45 | },
46 | {
47 | "name": "Tracy Teal",
48 | "orcid": "0000-0002-9180-9598"
49 | },
50 | {
51 | "name": "Cornelia Cronje",
52 | "orcid": "0000-0003-2736-6267"
53 | },
54 | {
55 | "name": "Trevor Keller",
56 | "orcid": "0000-0002-2920-8302"
57 | },
58 | {
59 | "name": "kdmclean"
60 | },
61 | {
62 | "name": "Aleksandra Nenadic",
63 | "orcid": "0000-0002-2269-3894"
64 | },
65 | {
66 | "name": "Alexander Robillard"
67 | },
68 | {
69 | "name": "Andrew Battista"
70 | },
71 | {
72 | "name": "Ariel Deardorff",
73 | "orcid": "0000-0001-8930-6089"
74 | },
75 | {
76 | "name": "Ben Companjen"
77 | },
78 | {
79 | "name": "Christopher Erdmann",
80 | "orcid": "0000-0003-2554-180X"
81 | },
82 | {
83 | "name": "David Durden"
84 | },
85 | {
86 | "name": "Evan Peter Williamson",
87 | "orcid": "0000-0002-7990-9924"
88 | },
89 | {
90 | "name": "Hannah Houts"
91 | },
92 | {
93 | "name": "Jen Hammock",
94 | "orcid": "0000-0002-9943-2342"
95 | },
96 | {
97 | "name": "Jennifer Daub"
98 | },
99 | {
100 | "name": "jenniferleeucalgary"
101 | },
102 | {
103 | "name": "John Wright"
104 | },
105 | {
106 | "name": "Jonathan Stoneman"
107 | },
108 | {
109 | "name": "Kate Hertweck",
110 | "orcid": "0000-0002-4026-4612"
111 | },
112 | {
113 | "name": "Kelly Barnes"
114 | },
115 | {
116 | "name": "Kelly Rowland"
117 | },
118 | {
119 | "name": "Michele Hayslett",
120 | "orcid": "0000-0001-8783-2763"
121 | },
122 | {
123 | "name": "Olubukola Oluranti Babalola"
124 | },
125 | {
126 | "name": "Peace Ossom Williamson"
127 | },
128 | {
129 | "name": "Phil Reed",
130 | "orcid": "0000-0002-4479-715X"
131 | },
132 | {
133 | "name": "Raniere Silva"
134 | },
135 | {
136 | "name": "Sarah LR Stevens",
137 | "orcid": "0000-0002-7040-548X"
138 | },
139 | {
140 | "name": "Steven Pryor",
141 | "orcid": "0000-0003-4494-935X"
142 | },
143 | {
144 | "name": "Alexandra Alisa Provo",
145 | "orcid": "0000-0001-8108-2025"
146 | },
147 | {
148 | "name": "biblioFile"
149 | },
150 | {
151 | "name": "Petra Hermankova",
152 | "orcid": "0000-0002-6349-0540"
153 | }
154 | ],
155 | "license": {
156 | "id": "CC-BY-4.0"
157 | }
158 | }
159 |
--------------------------------------------------------------------------------
/AUTHORS:
--------------------------------------------------------------------------------
1 | OpenRefine-ecology-lesson was written by:
2 |
3 | Abigail Cabunoc
4 | Aleksandra Nenadic
5 | April M. Wright
6 | Betty Rozum
7 | Bill Mills
8 | Brian Yandell
9 | C. Titus Brown
10 | Cam Macdonell
11 | Dan Mazur
12 | Debbie Paul
13 | Erin Becker
14 | Francois Michonneau
15 | Gabriel A. Devenyi
16 | Greg Wilson
17 | Hilmar Lapp
18 | Hugo Tavares
19 | Ian Carroll
20 | James Allen
21 | James Mickley
22 | Jeffrey W. Hollister
23 | Jon Pipitone
24 | Jonah Duckles
25 | Kari L. Jordan
26 | Lisa Zilinski
27 | Maxim Belkin
28 | Michael Hansen
29 | Nick Young
30 | Piotr Banaszkiewicz
31 | Raniere Silva
32 | Ross Dickson
33 | Ryan E. Johnson
34 | Rémi Emonet
35 | Timothée Poisot
36 | Tracy Teal
37 | W. Trevor King
38 | Zack Brym
39 | dlstrong
40 | evanwill
41 | trelogan
42 | Luis J. Villanueva
43 |
--------------------------------------------------------------------------------
/CITATION:
--------------------------------------------------------------------------------
1 | Please cite as:
2 |
3 | Deborah Paul and Cam Macdonell (eds): "Data Carpentry: Data Cleaning with OpenRefine Ecology lesson."
4 | Version 2017.04.0, April 2017,
5 | http://www.datacarpentry.org/OpenRefine-ecology-lesson/,
6 | FIXME: Add Zenodo DOI.
7 |
--------------------------------------------------------------------------------
/CODE_OF_CONDUCT.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: "Contributor Code of Conduct"
3 | ---
4 |
5 | As contributors and maintainers of this project,
6 | we pledge to follow the [The Carpentries Code of Conduct][coc].
7 |
8 | Instances of abusive, harassing, or otherwise unacceptable behavior
9 | may be reported by following our [reporting guidelines][coc-reporting].
10 |
11 |
12 | [coc-reporting]: https://docs.carpentries.org/topic_folders/policies/incident-reporting.html
13 | [coc]: https://docs.carpentries.org/topic_folders/policies/code-of-conduct.html
14 |
--------------------------------------------------------------------------------
/CONTRIBUTING.md:
--------------------------------------------------------------------------------
1 | # Contributing
2 |
3 | [The Carpentries][cp-site] ([Software Carpentry][swc-site], [Data
4 | Carpentry][dc-site], and [Library Carpentry][lc-site]) are open source
5 | projects, and we welcome contributions of all kinds: new lessons, fixes to
6 | existing material, bug reports, and reviews of proposed changes are all
7 | welcome.
8 |
9 | ## Contributor Agreement
10 |
11 | By contributing, you agree that we may redistribute your work under [our
12 | license](LICENSE.md). In exchange, we will address your issues and/or assess
13 | your change proposal as promptly as we can, and help you become a member of our
14 | community. Everyone involved in [The Carpentries][cp-site] agrees to abide by
15 | our [code of conduct](CODE_OF_CONDUCT.md).
16 |
17 | ## How to Contribute
18 |
19 | The easiest way to get started is to file an issue to tell us about a spelling
20 | mistake, some awkward wording, or a factual error. This is a good way to
21 | introduce yourself and to meet some of our community members.
22 |
23 | 1. If you do not have a [GitHub][github] account, you can [send us comments by
24 | email][contact]. However, we will be able to respond more quickly if you use
25 | one of the other methods described below.
26 |
27 | 2. If you have a [GitHub][github] account, or are willing to [create
28 | one][github-join], but do not know how to use Git, you can report problems
29 | or suggest improvements by [creating an issue][issues]. This allows us to
30 | assign the item to someone and to respond to it in a threaded discussion.
31 |
32 | 3. If you are comfortable with Git, and would like to add or change material,
33 | you can submit a pull request (PR). Instructions for doing this are
34 | [included below](#using-github).
35 |
36 | Note: if you want to build the website locally, please refer to [The Workbench
37 | documentation][template-doc].
38 |
39 | ## Where to Contribute
40 |
41 | 1. If you wish to change this lesson, add issues and pull requests here.
42 | 2. If you wish to change the template used for workshop websites, please refer
43 | to [The Workbench documentation][template-doc].
44 |
45 |
46 | ## What to Contribute
47 |
48 | There are many ways to contribute, from writing new exercises and improving
49 | existing ones to updating or filling in the documentation and submitting [bug
50 | reports][issues] about things that do not work, are not clear, or are missing.
51 | If you are looking for ideas, please see [the list of issues for this
52 | repository][repo-issues], or the issues for [Data Carpentry][dc-issues], [Library
53 | Carpentry][lc-issues], and [Software Carpentry][swc-issues] projects.
54 |
55 | Comments on issues and reviews of pull requests are just as welcome: we are
56 | smarter together than we are on our own. **Reviews from novices and newcomers
57 | are particularly valuable**: it's easy for people who have been using these
58 | lessons for a while to forget how impenetrable some of this material can be, so
59 | fresh eyes are always welcome.
60 |
61 | ## What *Not* to Contribute
62 |
63 | Our lessons already contain more material than we can cover in a typical
64 | workshop, so we are usually *not* looking for more concepts or tools to add to
65 | them. As a rule, if you want to introduce a new idea, you must (a) estimate how
66 | long it will take to teach and (b) explain what you would take out to make room
67 | for it. The first encourages contributors to be honest about requirements; the
68 | second, to think hard about priorities.
69 |
70 | We are also not looking for exercises or other material that only run on one
71 | platform. Our workshops typically contain a mixture of Windows, macOS, and
72 | Linux users; in order to be usable, our lessons must run equally well on all
73 | three.
74 |
75 | ## Using GitHub
76 |
77 | If you choose to contribute via GitHub, you may want to look at [How to
78 | Contribute to an Open Source Project on GitHub][how-contribute]. In brief, we
79 | use [GitHub flow][github-flow] to manage changes:
80 |
81 | 1. Create a new branch in your desktop copy of this repository for each
82 | significant change.
83 | 2. Commit the change in that branch.
84 | 3. Push that branch to your fork of this repository on GitHub.
85 | 4. Submit a pull request from that branch to the [upstream repository][repo].
86 | 5. If you receive feedback, make changes on your desktop and push to your
87 | branch on GitHub: the pull request will update automatically.
88 |
89 | NB: The published copy of the lesson is usually in the `main` branch.
90 |
91 | Each lesson has a team of maintainers who review issues and pull requests or
92 | encourage others to do so. The maintainers are community volunteers, and have
93 | final say over what gets merged into the lesson.
94 |
95 | ## Other Resources
96 |
97 | The Carpentries is a global organisation with volunteers and learners all over
98 | the world. We share values of inclusivity and a passion for sharing knowledge,
99 | teaching and learning. There are several ways to connect with The Carpentries
100 | community listed at including via social
101 | media, slack, newsletters, and email lists. You can also [reach us by
102 | email][contact].
103 |
104 | [repo]: https://github.com/datacarpentry/OpenRefine-ecology-lesson/
105 | [repo-issues]: https://github.com/datacarpentry/OpenRefine-ecology-lesson/issues
106 | [contact]: mailto:team@carpentries.org
107 | [cp-site]: https://carpentries.org/
108 | [dc-issues]: https://github.com/issues?q=user%3Adatacarpentry
109 | [dc-lessons]: https://datacarpentry.org/lessons/
110 | [dc-site]: https://datacarpentry.org/
111 | [discuss-list]: https://lists.software-carpentry.org/listinfo/discuss
112 | [github]: https://github.com
113 | [github-flow]: https://guides.github.com/introduction/flow/
114 | [github-join]: https://github.com/join
115 | [how-contribute]: https://egghead.io/courses/how-to-contribute-to-an-open-source-project-on-github
116 | [issues]: https://carpentries.org/help-wanted-issues/
117 | [lc-issues]: https://github.com/issues?q=user%3ALibraryCarpentry
118 | [swc-issues]: https://github.com/issues?q=user%3Aswcarpentry
119 | [swc-lessons]: https://software-carpentry.org/lessons/
120 | [swc-site]: https://software-carpentry.org/
121 | [lc-site]: https://librarycarpentry.org/
122 | [template-doc]: https://carpentries.github.io/workbench/
123 |
--------------------------------------------------------------------------------
/CONTRIBUTORS.md:
--------------------------------------------------------------------------------
1 | Materials have been developed and adapted by many contributors and were originally adapted from Software Carpentry materials.
2 |
3 | The first workshop was run at NESCent on May 8-9, 2014 with the development and
4 | instruction of lessons by Karen Cranston, Hilmar Lapp, Tracy Teal and Ethan White and contributions from Deb Paul and Mike Smorul.
5 |
6 | ## Data
7 |
8 | ### Biology
9 | Data is from the paper S. K. Morgan Ernest, Thomas J. Valone, and James H. Brown. 2009. Long-term monitoring and experimental manipulation of a Chihuahuan Desert ecosystem near Portal, Arizona, USA. Ecology 90:1708.
10 |
11 | http://esapubs.org/archive/ecol/E090/118/
12 |
13 | Excel data is from the paper Bahlai, C.A., Schaafsma, A.W., Lagos, D., Voegtlin, D., Smith, J.L., Welsman, J.A., Xue, Y., DiFonzo, C., Hallett, R.H., 2014. Factors inducing migratory forms of soybean aphid and an examination of North American spatial dynamics of this species in the context of migratory behavior. Agriculture and Forest Entomology. 16, 240-250.
14 |
15 | http://onlinelibrary.wiley.com/doi/10.1111/afe.12051/full
16 |
17 | Master_suction_trap_data_list_uncleaned.csv is a pre-cleaning version of a publically available dataset by David Voegtlin, Doris Lagos, Douglas Landis and Christie Bahlai, available at http://lter.kbs.msu.edu/datatables/122
18 |
19 | ## Lessons
20 |
21 | ### shell
22 |
23 | Original materials adapted from Software Carpentry shell lessons by Greg Wilson
24 | with contributions from Ethan White, Jens vdL, Raniere Silva, Meg Stanton, Amy
25 | Brown and Doug Latornell.
26 |
27 | ### SQL
28 |
29 | Original materials adapted from Software Carpentry SQL lessons for ecologists by
30 | Ethan White, which were adapted from Greg Wilson's original SQL lessons.
31 |
32 | ### R materials
33 | Original materials adapted from SWC Python lessons by Sarah Supp.
34 | John Blischak led the continued development of materials with contributions
35 | from Gavin Simpson, Tracy Teal, Greg Wilson, Diego Barneche, Stephen Turner and Karthik Ram.
36 |
37 | ### Spreadsheet Best Practices
38 | Original materials adapted from [Practical Data Management for Bug Counters](http://practicaldatamanagement.wordpress.com/) by Christie Bahlai
39 | Christie Bahlai and Aleksandra Pawlik led the continued development of materials with contributions
40 | from Jennifer Bryan, Alexander Duryee, Jeffrey Hollister, Daisie Huang, Owen Jones, and Ben Marwick
41 |
--------------------------------------------------------------------------------
/LICENSE.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: "Licenses"
3 | ---
4 |
5 | ## Instructional Material
6 |
7 | All Carpentries (Software Carpentry, Data Carpentry, and Library Carpentry)
8 | instructional material is made available under the [Creative Commons
9 | Attribution license][cc-by-human]. The following is a human-readable summary of
10 | (and not a substitute for) the [full legal text of the CC BY 4.0
11 | license][cc-by-legal].
12 |
13 | You are free:
14 |
15 | - to **Share**---copy and redistribute the material in any medium or format
16 | - to **Adapt**---remix, transform, and build upon the material
17 |
18 | for any purpose, even commercially.
19 |
20 | The licensor cannot revoke these freedoms as long as you follow the license
21 | terms.
22 |
23 | Under the following terms:
24 |
25 | - **Attribution**---You must give appropriate credit (mentioning that your work
26 | is derived from work that is Copyright (c) The Carpentries and, where
27 | practical, linking to ), provide a [link to the
28 | license][cc-by-human], and indicate if changes were made. You may do so in
29 | any reasonable manner, but not in any way that suggests the licensor endorses
30 | you or your use.
31 |
32 | - **No additional restrictions**---You may not apply legal terms or
33 | technological measures that legally restrict others from doing anything the
34 | license permits. With the understanding that:
35 |
36 | Notices:
37 |
38 | * You do not have to comply with the license for elements of the material in
39 | the public domain or where your use is permitted by an applicable exception
40 | or limitation.
41 | * No warranties are given. The license may not give you all of the permissions
42 | necessary for your intended use. For example, other rights such as publicity,
43 | privacy, or moral rights may limit how you use the material.
44 |
45 | ## Software
46 |
47 | Except where otherwise noted, the example programs and other software provided
48 | by The Carpentries are made available under the [OSI][osi]-approved [MIT
49 | license][mit-license].
50 |
51 | Permission is hereby granted, free of charge, to any person obtaining a copy of
52 | this software and associated documentation files (the "Software"), to deal in
53 | the Software without restriction, including without limitation the rights to
54 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
55 | of the Software, and to permit persons to whom the Software is furnished to do
56 | so, subject to the following conditions:
57 |
58 | The above copyright notice and this permission notice shall be included in all
59 | copies or substantial portions of the Software.
60 |
61 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
62 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
63 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
64 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
65 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
66 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
67 | SOFTWARE.
68 |
69 | ## Trademark
70 |
71 | "The Carpentries", "Software Carpentry", "Data Carpentry", and "Library
72 | Carpentry" and their respective logos are registered trademarks of
73 | [The Carpentries, Inc.][carpentries].
74 |
75 | [cc-by-human]: https://creativecommons.org/licenses/by/4.0/
76 | [cc-by-legal]: https://creativecommons.org/licenses/by/4.0/legalcode
77 | [mit-license]: https://opensource.org/licenses/mit-license.html
78 | [carpentries]: https://carpentries.org
79 | [osi]: https://opensource.org
80 |
--------------------------------------------------------------------------------
/NEWS.md:
--------------------------------------------------------------------------------
1 | ## Data Carpentry OpenRefine Ecology lesson 2017.04.0
2 |
3 | Initial release of the Data Carpentry OpenRefine Ecology lesson
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | [](https://slack-invite.carpentries.org/)
2 | [](https://carpentries.slack.com/messages/C9Y0RDGPQ)
3 | [](https://doi.org/10.5281/zenodo.570048)
4 |
5 | # OpenRefine-ecology
6 |
7 | **Data Cleaning with OpenRefine for Ecologists** Lesson for [Data Carpentry](https://datacarpentry.org/lessons/#ecology-workshop)
8 |
9 | ## OpenRefine Version
10 |
11 | The current version has been tested with OpenRefine 3.7.2 on May 2023.
12 |
13 | ## Data set notes
14 |
15 | - This data set is derived from [The Portal Project Long-term desert ecology](https://portal.weecology.org/) project data. [This data file](https://www.esapubs.org/archive/ecol/E090/118/Portal_rodents_19772002.csv) was downloaded and then modified specifically for use with OpenRefine.
16 | - Taxon names were put back into the file.
17 | - The number of rows was reduced to simplify the reconciliation and URL parsing exercises.
18 | - These modifications were made in order to illustrate some features of Open Refine.
19 | - Errors were added to the taxon names (`scientificName` field), to demonstrate OpenRefine's ability to find likely mis-entered data.
20 | - These errors can be found using clustering algorithms on the `scientificName` column, showing the power of the algorithms to find discrepancies quickly and making it simple to fix all issues found.
21 |
22 | ## Contributing
23 |
24 | We welcome all contributions to improve the lesson! Maintainers will do their best to help you if you have any questions, concerns, or experience any difficulties along the way.
25 | We'd like to ask you to familiarize yourself with our [Contribution Guide](CONTRIBUTING.md).
26 |
27 | Please see the current list of [issues](https://github.com/datacarpentry/OpenRefine-ecology-lesson/issues) for ideas for contributing to this repository. For making your contribution, we use the GitHub flow, which is nicely explained in the chapter [Contributing to a Project](https://git-scm.com/book/en/v2/GitHub-Contributing-to-a-Project) in Pro Git by Scott Chacon.
28 |
29 | Look for the tag . This indicates that the maintainers will welcome a pull request fixing this issue.
30 |
31 | ## Maintainers
32 |
33 | ### Current Maintainers
34 |
35 | - Luis J. Villanueva ([villanueval@si.edu](mailto:villanueval@si.edu))
36 |
37 | ### Past Authors and Maintainers
38 |
39 | - Abigail Cabunoc
40 | - Aleksandra Nenadic
41 | - April M. Wright
42 | - Betty Rozum
43 | - Bill Mills
44 | - Brian Yandell
45 | - C. Titus Brown
46 | - Cam Macdonell
47 | - Dan Mazur
48 | - Debbie Paul
49 | - Erin Becker
50 | - Francois Michonneau
51 | - Gabriel A. Devenyi
52 | - Greg Wilson
53 | - Hilmar Lapp
54 | - Hugo Tavares
55 | - Ian Carroll
56 | - James Allen
57 | - James Mickley
58 | - Jeffrey W. Hollister
59 | - Jon Pipitone
60 | - Jonah Duckles
61 | - Kari L. Jordan
62 | - Lisa Zilinski
63 | - Maxim Belkin
64 | - Michael Hansen
65 | - Nick Young
66 | - Piotr Banaszkiewicz
67 | - Raniere Silva
68 | - Ross Dickson
69 | - Ryan E. Johnson
70 | - Rémi Emonet
71 | - Timothée Poisot
72 | - Tracy Teal
73 | - W. Trevor King
74 | - Zack Brym
75 | - dlstrong
76 | - evanwill
77 | - trelogan
78 |
79 | See the [Authors](AUTHORS) page for details.
80 |
81 |
82 |
--------------------------------------------------------------------------------
/config.yaml:
--------------------------------------------------------------------------------
1 | #------------------------------------------------------------
2 | # Values for this lesson.
3 | #------------------------------------------------------------
4 |
5 | # Which carpentry is this (swc, dc, lc, or cp)?
6 | # swc: Software Carpentry
7 | # dc: Data Carpentry
8 | # lc: Library Carpentry
9 | # cp: Carpentries (to use for instructor training for instance)
10 | # incubator: The Carpentries Incubator
11 | carpentry: 'dc'
12 |
13 | # Overall title for pages.
14 | title: 'Data Cleaning with OpenRefine for Ecologists'
15 |
16 | # Date the lesson was created (YYYY-MM-DD, this is empty by default)
17 | created: '2015-04-04'
18 |
19 | # Comma-separated list of keywords for the lesson
20 | keywords: 'software, data, lesson, The Carpentries'
21 |
22 | # Life cycle stage of the lesson
23 | # possible values: pre-alpha, alpha, beta, stable
24 | life_cycle: 'stable'
25 |
26 | # License of the lesson materials (recommended CC-BY 4.0)
27 | license: 'CC-BY 4.0'
28 |
29 | # Link to the source repository for this lesson
30 | source: 'https://github.com/datacarpentry/OpenRefine-ecology-lesson'
31 |
32 | # Default branch of your lesson
33 | branch: 'main'
34 |
35 | # Who to contact if there are any issues
36 | contact: 'team@carpentries.org'
37 |
38 | # Navigation ------------------------------------------------
39 | #
40 | # Use the following menu items to specify the order of
41 | # individual pages in each dropdown section. Leave blank to
42 | # include all pages in the folder.
43 | #
44 | # Example -------------
45 | #
46 | # episodes:
47 | # - introduction.md
48 | # - first-steps.md
49 | #
50 | # learners:
51 | # - setup.md
52 | #
53 | # instructors:
54 | # - instructor-notes.md
55 | #
56 | # profiles:
57 | # - one-learner.md
58 | # - another-learner.md
59 |
60 | # Order of episodes in your lesson
61 | episodes:
62 | - 01-getting-started.md
63 | - 02-importing-data.md
64 | - 03-exploring-data.md
65 | - 04-transforming-data.md
66 | - 05-filter-exclude-sort.md
67 | - 06-reconciliation.md
68 | - 07-looking-up-data.md
69 | - 08-exporting-cleaning-steps.md
70 | - 09-exporting-data.md
71 | - 10-resources.md
72 |
73 | # Information for Learners
74 | learners:
75 |
76 | # Information for Instructors
77 | instructors:
78 |
79 | # Learner Profiles
80 | profiles:
81 |
82 | # Customisation ---------------------------------------------
83 | #
84 | # This space below is where custom yaml items (e.g. pinning
85 | # sandpaper and varnish versions) should live
86 |
87 |
88 | url: 'https://datacarpentry.github.io/OpenRefine-ecology-lesson'
89 | analytics: carpentries
90 | lang: en
91 |
--------------------------------------------------------------------------------
/episodes/01-getting-started.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Introduction
3 | teaching: 10
4 | exercises: 0
5 | ---
6 |
7 | ::::::::::::::::::::::::::::::::::::::: objectives
8 |
9 | - Describe OpenRefine’s uses and applications.
10 | - Differentiate data cleaning from data organization.
11 | - Experiment with OpenRefine’s user interface.
12 | - Locate helpful resources to learn more about OpenRefine.
13 |
14 | ::::::::::::::::::::::::::::::::::::::::::::::::::
15 |
16 | :::::::::::::::::::::::::::::::::::::::: questions
17 |
18 | - How is OpenRefine useful?
19 |
20 | ::::::::::::::::::::::::::::::::::::::::::::::::::
21 |
22 | ## Lesson
23 |
24 | ## Motivations for the OpenRefine Lesson
25 |
26 | - Data is often very messy, and this tool saves a lot of time on cleaning
27 | headaches.
28 |
29 | - Data cleaning steps often need repeating with multiple files. It is important to know what you did to your data. This makes it possible for you to repeat these steps again with similarly structured data. OpenRefine is
30 | perfect for speeding up repetitive tasks by replaying previous actions on
31 | multiple datasets.
32 |
33 | - Additionally, journals, granting agencies, and other institutions are requiring documentation of the
34 | steps you took when working with your data. With OpenRefine, you can capture
35 | all actions applied to your raw data and share them with your publication as
36 | supplemental material.
37 |
38 | - Any operation that changes the data in OpenRefine can be reversed or
39 | undone.
40 |
41 | - Some concepts such as clustering algorithms are quite complex, but with OpenRefine
42 | we can introduce them, use them, and show their power.
43 |
44 | > **Note:** You must export your modified dataset to a new file: OpenRefine does not save over the original source file. All changes are stored in the OpenRefine project.
45 |
46 | ## Before we get started
47 |
48 | The following setup is necessary before we can get started (see the [instructions here](../learners/setup.md).)
49 |
50 | ## What is OpenRefine?
51 |
52 | - OpenRefine is a Java program that runs on your machine (not in the cloud): it is a desktop application that uses your web browser as a graphical interface. No internet connection is needed, and none of the data or commands you enter in OpenRefine are sent to a remote server.
53 | - OpenRefine does not modify your original dataset. All actions can be reversed in OpenRefine and you can capture all the actions applied to your data and share this documentation with your publication as supplemental material.
54 | - OpenRefine saves as you go. You can return to the project at any time to pick up where you left off or export your data to a new file.
55 | - OpenRefine can be used to standardise and clean data across your file.
56 |
57 | ### It can also help you
58 |
59 | - Get an overview of a data set
60 | - Resolve inconsistencies in a data set
61 | - Help you split data up into more granular parts
62 | - Match local data up to other data sets
63 | - Enhance a data set with data from other sources
64 | - Save a set of data cleaning steps to replay on multiple files
65 |
66 | OpenRefine is a powerful, free, and open source tool with a large growing community of practice. More help can be found at [https://openrefine.org](https://openrefine.org).
67 |
68 | ### Features
69 |
70 | - Open source ([source on GitHub](https://github.com/OpenRefine/OpenRefine)).
71 | - A large growing community, from novice to expert, ready to help.
72 |
73 | ### More Information on OpenRefine
74 |
75 | You can find out a lot more about OpenRefine at the official user manual [docs.openrefine.org](https://docs.openrefine.org/). There is a [user forum](https://forum.openrefine.org) that can answer a lot of beginner questions and problems. [Recipes](https://github.com/OpenRefine/OpenRefine/wiki/Recipes), scripts, projects, and extensions are available to add functionality to OpenRefine. These can be copied into your OpenRefine instance to run on your dataset.
76 |
77 | :::::::::::::::::::::::::::::::::::::::: keypoints
78 |
79 | - OpenRefine is a powerful, free and open source tool that can be used for data cleaning.
80 | - OpenRefine will automatically track any steps you take in working with your data.
81 |
82 | ::::::::::::::::::::::::::::::::::::::::::::::::::
83 |
84 |
85 |
--------------------------------------------------------------------------------
/episodes/02-importing-data.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Importing Data to OpenRefine
3 | teaching: 10
4 | exercises: 0
5 | ---
6 |
7 | ::::::::::::::::::::::::::::::::::::::: objectives
8 |
9 | - Create a new OpenRefine project from a CSV file
10 |
11 | ::::::::::::::::::::::::::::::::::::::::::::::::::
12 |
13 | :::::::::::::::::::::::::::::::::::::::: questions
14 |
15 | - How can we import our data into OpenRefine?
16 |
17 | ::::::::::::::::::::::::::::::::::::::::::::::::::
18 |
19 | ## Importing data
20 |
21 | ::::::::::::::::::::::::::::::::::::::::: callout
22 |
23 | ## What kinds of data files can I import?
24 |
25 | There are several options for getting your data set into OpenRefine. You can import files in a variety of formats including:
26 |
27 | - Comma-separated values (CSV) or tab-separated values (TSV)
28 | - Text files
29 | - Fixed-width columns
30 | - JSON
31 | - XML
32 | - OpenDocument spreadsheet (ODS)
33 | - Excel spreadsheet (XLS or XLSX)
34 | - RDF data (JSON-LD, N3, N-Triples, Turtle, RDF/XML)
35 | - Wikitext
36 |
37 | See the [Create a project by importing data](https://docs.openrefine.org/manual/starting#create-a-project-by-importing-data) page in the OpenRefine manual for more information.
38 |
39 |
40 | ::::::::::::::::::::::::::::::::::::::::::::::::::
41 |
42 | ## Create your first OpenRefine project (using provided data)
43 |
44 | Start OpenRefine, which will open in your browser (at the address [http://127.0.0.0:3333](https://127.0.0.0:3333)). Once OpenRefine is launched in your
45 | browser, the left margin has options to:
46 |
47 | - `Create Project`
48 | - `Open Project`
49 | - `Import Project`
50 | - `Language Settings`
51 |
52 | 1. Click `Create Project` from the left margin and select then `This Computer` (because you're uploading data from your computer).
53 |
54 | 2. Click `Choose Files` and browse to where you stored the file `Portal_rodents_19772002_simplified.csv`. Select the
55 | file and click `Open`, or just double-click on the filename.
56 |
57 | {alt='Menu to create a new project'}
58 |
59 | 3. Click `Next>>` under the browse button to upload the data into OpenRefine.
60 |
61 | 4. On the next screen, OpenRefine will present you with a preview of your data. You can check here for obvious errors, if, for example, your file was tab-delimited rather than comma-delimited, the preview would look strange (and you could correct it by choosing the correct separator and clicking the `Update Preview` button on the right. If you selected the wrong file, click `<>` in the top right. You will be presented with a view onto your data. This is OpenRefine!
68 |
69 | The columns are all imported as text, even the columns with numbers. We will see how to format the numeric columns in the next episode.
70 |
71 | ::::::::::::::::::::::::::::::::::::::::: callout
72 |
73 | ## OpenRefine does not modify your original dataset
74 |
75 | Once your data is imported into a project - OpenRefine leaves your raw data intact and works on a copy which it creates
76 | inside the newly created project. All the data transformation and cleaning steps you apply will be performed on this copy
77 | and you can undo any changes too.
78 |
79 |
80 | ::::::::::::::::::::::::::::::::::::::::::::::::::
81 |
82 | :::::::::::::::::::::::::::::::::::::::: keypoints
83 |
84 | - Use the Create Project option to import data
85 | - You can control how data imports using options on the import screen
86 | - Several file types may be imported into OpenRefine
87 |
88 | ::::::::::::::::::::::::::::::::::::::::::::::::::
89 |
90 |
91 |
--------------------------------------------------------------------------------
/episodes/03-exploring-data.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Exploring Data with OpenRefine
3 | teaching: 15
4 | exercises: 20
5 | ---
6 |
7 | ::::::::::::::::::::::::::::::::::::::: objectives
8 |
9 | - Learn about different types of facets and how they can be used to summarise data of different data types
10 |
11 | ::::::::::::::::::::::::::::::::::::::::::::::::::
12 |
13 | :::::::::::::::::::::::::::::::::::::::: questions
14 |
15 | - How can we summarise our data?
16 | - How can we find errors in our data?
17 | - How can we edit data to fix errors?
18 | - How can we convert column data from one data type to another?
19 |
20 | ::::::::::::::::::::::::::::::::::::::::::::::::::
21 |
22 | ## Exploring data with facets
23 |
24 | Facets are one of the most useful features of OpenRefine. Data faceting is a process of exploring data by applying multiple filters to investigate its composition. It also allows you to identify a subset of data that you wish to change in bulk.
25 |
26 | A `facet` groups all the like values that appear in a column, and allows you to filter the data by those values. It also allows you to edit values across many records at the same time.
27 |
28 | ### Exploring text columns
29 |
30 | One type of facet is called a 'Text facet'. This groups all the identical text values in a column and lists each value with the number of records it appears in. The facet information always appears in the left hand panel in the OpenRefine interface.
31 |
32 | Here we will use faceting to look for potential errors in data entry in the `scientificName` column.
33 |
34 | 1. Scroll over to the `scientificName` column.
35 |
36 | 2. Click the down arrow and choose `Facet` > `Text facet`.
37 |
38 | {alt='Facet menu of a column'}
39 |
40 | 3. In the left panel, you'll now see a box containing every unique value in the `scientificName` column
41 | along with a number representing how many times that value occurs in the column.
42 |
43 | {alt='Faceting results on the column scientificName'}
44 |
45 | 4. Try sorting this facet by name and by count. Do you notice any problems with the data? What are they?
46 |
47 | 5. Hover the mouse over one of the names in the `facet` list. You should see that you have an `edit` function available.
48 |
49 | 6. You could use this to fix an error immediately, and OpenRefine will ask whether you want to make the same correction to every value it finds like that one. But OpenRefine offers even better ways to find and fix these errors, which we'll use instead. We'll learn about these when we talk about clustering.
50 |
51 | ::::::::::::::::::::::::::::::::::::::::: callout
52 |
53 | ## Facets and large datasets
54 |
55 | Facets are intended to group together common values and OpenRefine limits the number of values allowed in a single facet to ensure the software does not perform slowly or run out of memory. If you create a facet where there are many unique values (for example, a facet on a 'book title' column in a data set that has one row per book) the facet created will be very large and may either slow down the application, or OpenRefine will not create the facet.
56 |
57 |
58 | ::::::::::::::::::::::::::::::::::::::::::::::::::
59 |
60 | ::::::::::::::::::::::::::::::::::::::: challenge
61 |
62 | ## Exercise
63 |
64 | 1. Using faceting, find out how many years are represented in the census.
65 | 2. Which years have the most and least observations?
66 | 3. Is the column formatted as Number, Date, or Text?
67 |
68 | ::::::::::::::: solution
69 |
70 | ## Solution
71 |
72 | 1. For the column `yr` do `Facet` > `Text facet`. A box will appear in the left panel showing that there are 16 unique entries in this column.
73 | 2. After creating a facet, click `Sort by count` in the facet box. The year with the most observations is 1978. The least is 1993.
74 | 3. By default, the column `yr` is formatted as Text.
75 |
76 | :::::::::::::::::::::::::
77 |
78 | ::::::::::::::::::::::::::::::::::::::::::::::::::
79 |
80 | ### Exploring numeric columns
81 |
82 | When a table is imported into OpenRefine, all columns are treated as having text values. We can transform columns to other data types (e.g. number or date) using the `Edit cells` > `Common transforms` feature. Here we will experiment changing columns to numbers and see what additional capabilities that grants us.
83 |
84 | #### Numeric facet
85 |
86 | Sometimes there are non-number values or blanks in a column which may represent errors in data entry and we want to find them. We can do that with a `Numeric facet`.
87 |
88 | Create a `numeric facet` for the column `yr`. The facet will be empty because OpenRefine sees all the values as text.
89 |
90 | To transform cells in the `yr` column to numbers, click the down arrow for that column, then `Edit cells` > `Common transforms…` > `To number`. You will notice the `yr` values change from left-justified to right-justified, and black to green color.
91 |
92 | ::::::::::::::::::::::::::::::::::::::: challenge
93 |
94 | ## Exercise
95 |
96 | The dataset included other numeric columns that we will explore in this exercise:
97 |
98 | - `period` - Unique number assigned to each survey period
99 | - `plot` - Plot number animal was caught on, from 1 to 24
100 | - `recordID` - Unique record ID number to facilitate quick reference to particular entry
101 |
102 | Transform the columns `period`, `plot`, and `recordID` from text to numbers.
103 |
104 | 1. How does changing the format change the faceting display for the `yr` column?
105 | 2. Can all columns be transformed to numbers?
106 |
107 | ::::::::::::::: solution
108 |
109 | ## Solution
110 |
111 | Displaying a `Numeric facet` of `yr` shows a histogram of the number of
112 | entries per year. Notice that the data is shown as a number, not a date. If you instead transform the column to a date, the program will assume all entries are on January 1st of the year.
113 |
114 | Only observations that include only numerals (0-9) can be transformed to numbers. If you apply a number transformation to a column that doesn't meet this criteria, and then click the Undo / Redo tab, you will see a step that starts with Text transform on 0 cells. This means that the data in that column was not transformed.
115 |
116 | :::::::::::::::::::::::::
117 |
118 | ::::::::::::::::::::::::::::::::::::::::::::::::::
119 |
120 | The next exercise will explore what happens when a numeric column contains values that are not numbers.
121 |
122 | ::::::::::::::::::::::::::::::::::::::: challenge
123 |
124 | ## Exercise
125 |
126 | 1. For a column you transformed to numbers, edit one or two cells, replacing the numbers with text (such as `abc`) or blank (no number or text).
127 | 2. Use the pulldown menu to apply a numeric facet to the column you edited. The facet will appear in the left panel.
128 | 3. Notice that there are several checkboxes in this facet: `Numeric`, `Non-numeric`, `Blank`, and `Error`. Below these are counts of the number of cells in each category. You should see checks for `Non-numeric` and `Blank` if you changed some values.
129 | 4. Experiment with checking or unchecking these boxes to select subsets of your data.
130 |
131 |
132 | ::::::::::::::::::::::::::::::::::::::::::::::::::
133 |
134 | When done examining the numeric data, remove this facet by clicking the `x` in the upper left corner of its panel. Note that this does not undo the edits you made to the cells in this column.
135 |
136 | #### Examine a pair of numeric columns using scatterplots
137 |
138 | Now that we have multiple columns representing numbers, we can see how they relate to one another using the scatterplot facet. Select a numeric column, for example `recordID`, and use the pulldown menu to > `Facet` > `Scatterplot facet`. A new window called `Scatterplot Matrix` will appear. There are squares for each pair of numeric columns organized in an upper right triangle. Each square has little dots for the cell values from each row.
139 |
140 | {alt='Scatterplots between numeric columns'}
141 |
142 | Click the image of the scatterplot between `recordID` and `yr` to select this one for the facet.
143 |
144 | ::::::::::::::::::::::::::::::::::::::: challenge
145 |
146 | ## Exercise
147 |
148 | Click in the scatterplot facet in the lower left margin and drag to highlight a rectangle. How does this change the data rows displayed?
149 |
150 |
151 | ::::::::::::::::::::::::::::::::::::::::::::::::::
152 |
153 | ::::::::::::::::::::::::::::::::::::::::: callout
154 |
155 | ## More Details on Faceting
156 |
157 | Full documentation on faceting can be found at [Exploring facets: Faceting](https://docs.openrefine.org/manual/facets)
158 |
159 |
160 | ::::::::::::::::::::::::::::::::::::::::::::::::::
161 |
162 | :::::::::::::::::::::::::::::::::::::::: keypoints
163 |
164 | - Faceting can identify errors or outliers in data
165 |
166 | ::::::::::::::::::::::::::::::::::::::::::::::::::
167 |
168 |
169 |
--------------------------------------------------------------------------------
/episodes/04-transforming-data.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Transforming Data
3 | teaching: 20
4 | exercises: 15
5 | ---
6 |
7 | ::::::::::::::::::::::::::::::::::::::: objectives
8 |
9 | - Learn about clustering and how it is applied to group and edit typos
10 | - Split values from one column into multiple columns
11 | - Manipulate data using previous cleaning steps with undo/redo
12 | - Remove leading and trailing white spaces from cells
13 |
14 | ::::::::::::::::::::::::::::::::::::::::::::::::::
15 |
16 | :::::::::::::::::::::::::::::::::::::::: questions
17 |
18 | - How can we transform our data to correct errors?
19 |
20 | ::::::::::::::::::::::::::::::::::::::::::::::::::
21 |
22 | ## Data splitting
23 |
24 | We can split data from one column into multiple columns if the parts are separated by a common separator (say a comma, or a space).
25 |
26 | 1. Let us suppose we want to split the `scientificName` column into separate columns, one for genus and one for species.
27 | 2. Click the down arrow next to the `scientificName` column. Choose `Edit Column` > `Split into several columns...`
28 | 3. In the pop-up, in the `Separator` box, replace the comma with a space (the box will look empty when you're done).
29 | 4. Important! Uncheck the box that says `Remove this column`.
30 | 5. Click `OK`. You should get some new columns called `scientificName 1`, `scientificName 2`, `scientificName 3`, and `scientificName 4`.
31 | 6. Notice that in some cases these newly created columns are empty (you can check by text faceting the column). Why? What do you think we can do to fix it?
32 |
33 | The entries that have data in `scientificName 3` and `scientificName 4` but not the first two `scientificName` columns had an extra space at the beginning of the entry. Leading and trailing white spaces are very difficult to notice when cleaning data
34 | manually. This is another advantage of using OpenRefine to clean your data - this process can be automated.
35 |
36 | In newer versions of OpenRefine (from version 3.4.1) there is now an option to
37 | clean leading and trailing white spaces from all data when importing the data initially and creating the project.
38 |
39 | ::::::::::::::::::::::::::::::::::::::: challenge
40 |
41 | ## Exercise
42 |
43 | Look at the data in the column `coordinates` and split these values to obtain latitude and longitude. Make sure that the option for `Guess cell type` is checked and that `Remove this column` is not. Rename the new columns.
44 |
45 | What type of data does OpenRefine assign to the new columns?
46 |
47 | ::::::::::::::: solution
48 |
49 | ## Solution
50 |
51 | Both new columns will appear with green text, indicating they are numeric. The option for `Guess cell type` allowed OpenRefine to guess that these values were numeric.
52 |
53 |
54 |
55 | :::::::::::::::::::::::::
56 |
57 | ::::::::::::::::::::::::::::::::::::::::::::::::::
58 |
59 | ## Undoing / Redoing actions
60 |
61 | It is common while exploring and cleaning a dataset to make a mistake or decide to change the order of the process you wish to conduct. OpenRefine provides `Undo` and `Redo` operations to roll back your changes.
62 |
63 | 1. Click `Undo / Redo` in the left side of the screen. All the changes you have made will appear in the left-hand panel.
64 | The current stage in the data processing is highlighted in blue (i.e. step 4. in the screenshot below). As you click
65 | on the different stages in the process, the step identified in blue will change and, far more importantly, the data
66 | will revert to that stage in the processing.
67 |
68 | {alt='OpenRefine tab for Undo/Redo actions'}
69 |
70 | 2. We want to undo the splitting of the column `scientificName`. Select the stage just
71 | before the split occurred and the new `scientificName` columns will disappear.
72 |
73 | 3. Notice that you can still click on the last stage and make the columns reappear, and toggle back and forth between these states. You can also select the state more than one steps back and revert to that state.
74 |
75 | 4. Let's leave the dataset in the state before `scientificNames` was split.
76 |
77 | ## Trimming leading and trailing whitespace
78 |
79 | Words with spaces at the beginning or end are particularly hard for humans to identify from strings without these spaces (as we have seen with the `scientificName` column). However, blank spaces can make a big difference to computers, so we usually want to remove them.
80 |
81 | 1. In the header for the column `scientificName`, choose `Edit cells` > `Common transforms` > `Trim leading and trailing whitespace`.
82 | 2. Notice that the `Split` step has now disappeared from the `Undo / Redo` pane on the left and is replaced with a `Text transform on 2 cells`
83 |
84 | ::::::::::::::::::::::::::::::::::::::: challenge
85 |
86 | ## Exercise
87 |
88 | Repeat the splitting of column `scientificName` exercise after trimming the whitespace.
89 |
90 | ::::::::::::::: solution
91 |
92 | ## Solution
93 |
94 | On the `scientificName` column, click the down arrow next to the `scientificName` column and
95 | choose `Edit Column` > `Split into several columns...` from the drop down menu. Use a blank character as a separator,
96 | as before. You should now get only two columns `scientificName 1` and `scientificName 2`.
97 |
98 |
99 |
100 | :::::::::::::::::::::::::
101 |
102 | ::::::::::::::::::::::::::::::::::::::::::::::::::
103 |
104 | ## Renaming columns
105 |
106 | We now have the genus and species parts neatly separated into 2 columns - `scientificName 1` and `scientificName 2`.
107 | We want to rename these as `genus` and `species`, respectively.
108 |
109 | 1. Let's first rename the `scientificName 1` column. On the column, click the down arrow and then `Edit column` > `Rename this column`.
110 | 2. Type "genus" into the box that appears.
111 |
112 | ::::::::::::::::::::::::::::::::::::::: challenge
113 |
114 | ## Exercise
115 |
116 | Try to change the name of the `scientificName 2` column to `species`. What problem do you encounter? How can you fix the problem?
117 |
118 | ::::::::::::::: solution
119 |
120 | ## Solution
121 |
122 | 1. On the `scientificName 2` column, click the down arrow and then `Edit column` > `Rename this column`.
123 | 2. Type "species" into the box that appears.
124 | 3. A pop-up will appear that says `Another column already named species`. This is because there is another column with the same name where we've recorded the species abbreviation.
125 | 4. You can use another name for the `scientificName 2` or change the name of the `species` column and then rename the `scientificName 2` column.
126 |
127 |
128 |
129 | :::::::::::::::::::::::::
130 |
131 | ::::::::::::::::::::::::::::::::::::::::::::::::::
132 |
133 | Edit the name of the `species` column to `species_abbreviation`. Then, rename `scientificName 2` to `species`.
134 |
135 | ## Combining columns to create new ones
136 |
137 | The date for each row in the data file is split in three columns: `dy` (day), `mo` (month), and `yr` (year). We can create a new column with the date in the format we want by combining these columns.
138 |
139 | - Click on the menu for the `yr` column and select `Edit column` > `Join columns...`.
140 |
141 | - In the window that opens up, check the boxes next to the columns `yr`, `mo`, and `dy`.
142 |
143 | - Enter `-` as a separator.
144 |
145 | - Select the option `Write result in new column named` and write `date` as the name for the new column.
146 |
147 | - Click `OK`
148 |
149 | {alt='OpenRefine window for joining columns'}
150 |
151 | You can change the order of the columns by dragging the columns in the left side of the window.
152 |
153 | Once the new column is created, convert it to date using `Edit cells` > `Common transforms` > `To date`. Now you can explore the data using a timeline facet. Create the new facet by clicking on the menu for the column `date` and select `Facet` > `Timeline facet`.
154 |
155 | ## Data clustering
156 |
157 | Clustering allows you to find groups of entries that are not identical but are
158 | sufficiently similar that they may be alternative representations of the same thing (term or data value).
159 | For example, the two strings `New York` and `new york` are very likely to refer to the same concept and just have a
160 | capitalization difference. Likewise, `Björk` and `Bjork` probably refer to the same person. These kinds of variations
161 | occur a lot in scientific data. Clustering gives us a tool to resolve them.
162 |
163 | OpenRefine provides different clustering algorithms. The best way to understand how they work is to experiment with them.
164 |
165 | The dataset has several near-identical entries in `scientificName`. For example, there are two misspellings of *Ammospermophilus harrisii*:
166 |
167 | - *Ammospermophilis harrisi* and
168 | - *Ammospermophilus harrisi*
169 |
170 | 1. If you removed it, reinstate the `scientificName` text facet (you can also remove all the other facets to gain some space).
171 | In the `scientificName` text facet box - click the `Cluster` button.
172 |
173 | 2. In the resulting pop-up window, you can change the `Method` and the `Keying Function`. Try different combinations to see what different mergers of values are suggested.
174 |
175 | 3. If you select the `key collision` method and the `metaphone3` keying function, it should identify one cluster:
176 |
177 | {alt='OpenRefine window for clustering'}
178 |
179 | 4. Note that the `New Cell Value` column displays the new name that will replace the value in all the cells in the
180 | group. You can change this if you wish to choose a different value than the suggested one.
181 |
182 | 5. Tick the `Merge?` checkbox beside each group, then click `Merge selected & Close` to apply the corrections to the dataset and close the window.
183 |
184 | 6. The text facet of `scientificName` will update to show the new summary of the column. It will now have ten options:
185 |
186 | {alt='Facet of scientificName after clustering'}
187 |
188 | ::::::::::::::::::::::::::::::::::::::::: callout
189 |
190 | ## Clustering Documentation
191 |
192 | Full documentation on clustering can be found at the [OpenRefine Clustering Methods In-depth](https://openrefine.org/docs/technical-reference/clustering-in-depth) page of the OpenRefine manual.
193 |
194 |
195 | ::::::::::::::::::::::::::::::::::::::::::::::::::
196 |
197 | :::::::::::::::::::::::::::::::::::::::: keypoints
198 |
199 | - Clustering can identify outliers in data and help us fix errors in bulk
200 |
201 | ::::::::::::::::::::::::::::::::::::::::::::::::::
202 |
203 |
204 |
--------------------------------------------------------------------------------
/episodes/05-filter-exclude-sort.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Filtering and Sorting with OpenRefine
3 | teaching: 15
4 | exercises: 20
5 | ---
6 |
7 | ::::::::::::::::::::::::::::::::::::::: objectives
8 |
9 | - Employ *text filter* or *include/exclude* to filter to a subset of rows.
10 | - Sort tables by a column.
11 | - Sort tables by multiple columns.
12 |
13 | ::::::::::::::::::::::::::::::::::::::::::::::::::
14 |
15 | :::::::::::::::::::::::::::::::::::::::: questions
16 |
17 | - How can we select only a subset of our data to work with?
18 | - How can we sort our data?
19 |
20 | ::::::::::::::::::::::::::::::::::::::::::::::::::
21 |
22 | ## Filtering
23 |
24 | Sometimes you want to view and work only with a subset of data or apply an operation only to a subset.
25 | You can do this by applying various filters to your data.
26 |
27 | ### Including/excluding data entries on facets
28 |
29 | One way to filter down our data is to use the `include` or `exclude` buttons on the entries in a text facet.
30 | If you still have your text facet for `scientificName`, you can use it. If you've closed that facet, recreate it by selecting `Facet` > `Text facet` on the `scientificName` column.
31 |
32 | 1. In the text facet, hover over one of the names, e.g. *Baiomys taylori*. Notice that when you hover over it, there are buttons to the right for `edit` and `include`.
33 | 2. Whilst hovering over *Baiomys taylori*, move to the right and click the `include` option. This will include this species, as signified by the name of the species changing from blue to orange, and new options of `edit` and
34 | `exclude` will be presented. Note that in the top of the page, "33 matching rows" is now displayed instead of "790 rows".
35 | 3. You can include other species in your current filter - e.g. click on *Chaetodipus baileyi* in the same way to include it in the filter.
36 | 4. Alternatively, you can click the name of the species to include it in the filter instead of clicking the
37 | `include`/`exclude` buttons. This will include the selected species and exclude all other options in a single step, which can be useful.
38 | 5. Click `include` and `exclude` on the other species and notice how the entries appear and
39 | disappear from the data table to the right.
40 |
41 | Click on `Reset` at the top-right of the facet before continuing to the next step.
42 |
43 | ### Text filters
44 |
45 | One way to filter data is to create a text filter on a column. Close all facets you may have created previously and reinstate the text facet on the `scientificName` column.
46 |
47 | 1. Click the down arrow next to `scientificName` > `Text filter`. A `scientificName` filter will appear on the left margin below the text facet.
48 |
49 | 2. Type in `bai` into the text box in the filter and press return. At the top of the page it will report that, out of the 790 rows in the raw data, there are 35 rows in which the text has been found within the `scientificName` column (and these rows will be selected for the
50 | subsequent steps).
51 |
52 | {alt='OpenRefine filtering example'}
53 |
54 | 3. Near the top of the screen, change `Show:` to 50. This way, you will see all the matching rows in a single page.
55 |
56 | ::::::::::::::::::::::::::::::::::::::: challenge
57 |
58 | ## Exercise
59 |
60 | 1. What scientific names are selected by this text filter?
61 | 2. How would you restrict the filter to one of the species selected?
62 |
63 | ::::::::::::::: solution
64 |
65 | ## Solution
66 |
67 | 1. Do `Facet` > `Text facet` on the `scientificName` column after filtering. This will show that
68 | two names match your filter criteria. They are *Baiomys taylori* and *Chaetodipus baileyi*.
69 | 2. To restrict to only one of these two species, you could:
70 |
71 | - Check the `case sensitive` box within the `scientificName` facet. Once you do this, you will see that using the upper-case `Bai` will only > > return *Baiomys taylori*, while using lower-case `bai` will only return *Chaetodipus baileyi*.
72 | - You could include more letters in your filter (i.e. typing `baio` will exclusively return *Baiomys taylori*, while `bail` will only return *Chaetodipus baileyi*).
73 |
74 | :::::::::::::::::::::::::
75 |
76 | ::::::::::::::::::::::::::::::::::::::::::::::::::
77 |
78 | ::::::::::::::::::::::::::::::::::::::::: callout
79 |
80 | ## Filters vs. facets
81 |
82 | Faceting and filtering look very similar. A good distinction is that faceting gives you an overview of all the data that
83 | is currently selected, while filtering allows you to select a subset of your data for further inspection and analysis.
84 |
85 | ::::::::::::::::::::::::::::::::::::::::::::::::::
86 |
87 | **Important:** Make sure both species (*Baiomys taylori* and *Chaetodipus baileyi*) are included in your filtered dataset before continuing with the rest of the exercises.
88 |
89 | ## Sort
90 |
91 | Sorting data is a useful practice for detecting outliers in data - potential errors and blanks
92 | will sort to the top or the bottom of your data.
93 |
94 | You can sort the data in a column by using the drop-down menu available in that column.
95 | There you can sort by `text`, `numbers`, `dates` or `booleans` (`TRUE` or `FALSE` values). You can also specify what order to put `Blanks` and `Errors` in the sorted results.
96 |
97 | If this is your first time sorting this table, then the drop-down menu for the selected column shows `Sort...`. Select what you would like to sort by (such as `numbers`). Additional options will then appear for you to fine-tune your sorting.
98 |
99 | ::::::::::::::::::::::::::::::::::::::: challenge
100 |
101 | ## Exercise
102 |
103 | Sort by month. How can you ensure that months are in order?
104 |
105 | ::::::::::::::: solution
106 |
107 | ## Solution
108 |
109 | In the `mo` column, select `Sort...` > `numbers` and select `smallest first`. The months are listed from 1 (for January) through 12 (December).
110 |
111 |
112 |
113 | :::::::::::::::::::::::::
114 |
115 | ::::::::::::::::::::::::::::::::::::::::::::::::::
116 |
117 | If you try to re-sort a column that you have already used, the drop-down menu changes slightly, to > `Sort` without the `...`, to remind you that you have already used this column. It will give you additional options:
118 |
119 | - > `Sort` > `Sort...` - This option enables you to modify your original sort.
120 | - > `Sort` > `Reverse` - This option allows you to reverse the order of the sort.
121 | - > `Sort` > `Remove sort` - This option allows you to undo your sort.
122 |
123 | ::::::::::::::::::::::::::::::::::::::: challenge
124 |
125 | ## Exercise
126 |
127 | Sort the data by `plot`. What year(s) were observations recorded for plot 1 in this filtered dataset?
128 |
129 | ::::::::::::::: solution
130 |
131 | ## Solution
132 |
133 | In the `plot` column, select `Sort...` > `numbers` and select `smallest first`. The years represented include 1990 and 1995.
134 |
135 | :::::::::::::::::::::::::
136 |
137 | ::::::::::::::::::::::::::::::::::::::::::::::::::
138 |
139 | ### Sorting by multiple columns
140 |
141 | You can sort by multiple columns by performing sort on additional columns. The sort will depend on the order in which you select columns to sort. To restart the sorting process with a particular column, check the `sort by this column alone` box in the `Sort` pop-up menu.
142 |
143 | ::::::::::::::::::::::::::::::::::::::: challenge
144 |
145 | ## Exercise
146 |
147 | You might like to look for trends in your data by month of collection across years.
148 |
149 | 1. How do you sort your data by month?
150 | 2. How would you do this differently if you were instead trying to see all of your entries in chronological order?
151 |
152 | ::::::::::::::: solution
153 |
154 | ## Solution
155 |
156 | 1. For the `mo` column, click on `Sort...` and then `numbers`. This will group all entries made in, for example, January,
157 | together, regardless of the year that entry was collected.
158 | 2. For the `yr` column, click on `Sort` > `Sort...` > `numbers` and select `sort by this column alone`. This will undo the
159 | sorting by month step. Once you've sorted by `yr` you can then apply another sorting step to sort by month within year. To do this
160 | for the `mo` column, click on `Sort` > `numbers` but do not select `sort by this column alone`. To ensure that all entries are shown
161 | chronologically, you will need to also sort by days within each month. Click on the `dy` column then `Sort` > `numbers`. Your data should now be in chronological order.
162 |
163 | :::::::::::::::::::::::::
164 |
165 | ::::::::::::::::::::::::::::::::::::::::::::::::::
166 |
167 | If you go back to one of the already sorted columns and select > `Sort` > `Remove sort`, that column is removed from your multiple sort. If it is the only column sorted, then data reverts to its original order.
168 |
169 | ::::::::::::::::::::::::::::::::::::::: challenge
170 |
171 | ## Exercise
172 |
173 | Sort by `year`, `month` and `day` in some order. Be creative: try sorting as `numbers` or `text`, and in reverse order (`largest to smallest` or `z to a`).
174 |
175 | Use `Sort` > `Remove sort` to remove the sort on the second of three columns. Notice how that changes the order.
176 |
177 |
178 | ::::::::::::::::::::::::::::::::::::::::::::::::::
179 |
180 | :::::::::::::::::::::::::::::::::::::::: keypoints
181 |
182 | - OpenRefine provides various ways to sort and filter data without affecting the raw data.
183 |
184 | ::::::::::::::::::::::::::::::::::::::::::::::::::
185 |
186 |
187 |
--------------------------------------------------------------------------------
/episodes/06-reconciliation.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Reconciliation of Values
3 | teaching: 20
4 | exercises: 10
5 | ---
6 |
7 | ::::::::::::::::::::::::::::::::::::::: objectives
8 |
9 | - Add external reconciliation services.
10 | - Cleanup scientific names by matching them to a taxonomy.
11 | - Identify and correct misspelled or incorrect names for a taxon.
12 |
13 | ::::::::::::::::::::::::::::::::::::::::::::::::::
14 |
15 | :::::::::::::::::::::::::::::::::::::::: questions
16 |
17 | - How can we reconcile scientific names against a taxonomy?
18 |
19 | ::::::::::::::::::::::::::::::::::::::::::::::::::
20 |
21 | ## Reconciliation of names
22 |
23 | Reconciliation services allow you to lookup terms from your data in OpenRefine against external services, and use values from the external services in your data. The OpenRefine manual provides [more information about the reconciliation feature](https://docs.openrefine.org/manual/reconciling).
24 |
25 | Reconciliation services can be more sophisticated and often quicker than using the method described above to retrieve data from a URL. However, to use the `Reconciliation` function in OpenRefine requires the external resource to support the necessary service for OpenRefine to work with, which means unless the service you wish to use supports such a service you cannot use the `Reconciliation` approach.
26 |
27 | There are a few services where you can find an OpenRefine Reconciliation option available. For example Wikidata has a reconciliation service at [https://wikidata.reconci.link/](https://wikidata.reconci.link/).
28 |
29 | ## Reconcile scientific names with the Encyclopedia of Life (EOL)
30 |
31 | We can use the [Encyclopedia of Life](https://eol.org/) Reconciliation service to find the taxonomic matches to the names in the dataset.
32 |
33 | 1. In the `scientificName` column use the dropdown menu to choose 'Reconcile->Start Reconciling'
34 |
35 | 2. If this is the first time you've used this particular reconciliation service, you'll need to add the details of the service now
36 |
37 | - Click 'Add Standard Service...' and in the dialogue that appears enter:
38 | - `https://eol.org/api/reconciliation`
39 | {alt='Prompt to add a service URL for reconciliation'}
40 |
41 | 3. You should now see a heading in the list on the left hand side of the Reconciliation dialogue called "Encyclopedia of Life"
42 |
43 | 4. Click on this to choose to use this reconciliation service
44 |
45 | 5. In the middle box in the reconciliation dialogue you may get asked what type of 'entity' you want to reconcile to - that is, what type of thing are you looking for. The list will vary depending on what reconciliation service you are using.
46 |
47 | - In this case, the only option is "Taxon"
48 |
49 | 6. In the box on the righthand side of the reconciliation dialogue you can choose if other columns are used to help the reconciliation service make a match - however it is sometimes hard to tell what use (if any) the reconciliation service makes of these additional columns
50 |
51 | 7. At the bottom of the reconciliation dialogue there is the option to "Auto-match candidates with high confidence". This can be a time saver, but in this case you are going to uncheck it, so you can see the results before a match is made
52 |
53 | 8. Now click 'Start Reconciling'
54 |
55 | {alt='Reconciliation menu'}
56 |
57 | Reconciliation is an operation that can take a little time if you have many values to look up.
58 |
59 | Once the reconciliation has completed two Facets should be created automatically:
60 |
61 | - scientificName: Judgement
62 | - scientificName: best candidate's score
63 |
64 | These are two of several specific reconciliation facets and actions that you can get from the 'Reconcile' menu (from the column drop down menu).
65 |
66 | Close the 'scientificName: best candidate's score' facet, but leave the 'scientificName: Judgement' facet open.
67 |
68 | If you look at the scientificName column, you should see some cells have found one or more matches - the potential matches are shown in a list in each cell. Next to each potential match there is a 'tick' and a 'double tick'. To accept a reconciliation match you can use the 'tick' options in cells. The 'tick' accepts the match for the single cell, the 'double tick' accepts the match for all identical cells.
69 |
70 | 1. Create a text facet on the scientificName column
71 | 2. Choose *Ammospermophilus harrisii*
72 |
73 | - In the scientificName column you should be able to see the various potential matches. Clicking on a match will take you to the EOL page for that entity
74 | {alt='Reconciliation menu for each cell'}
75 |
76 | 1. Click a 'double tick' in one of the scientificName column cells for the option "*Ammospermophilus harrisii* (Audubon \& Bachman 1854)"
77 | 2. This will accept this as a match for all cells with this value - you should see the other options disappear
78 |
79 | There are two things that reconciliation can do for you. Firstly it gets a standard form of the name or label for the entity. Secondly it gets an ID for the entity - in this case a page and numeric id for the scientific name in EOL. This is hidden in the default view, but can be extracted:
80 |
81 | 1. In the scientificName column use the dropdown menu to choose `Reconcile` > `Add entity identifiers column...`
82 | 2. Give the column the name "EOL-ID"
83 | 3. This will create a new column that contains the EOL ID for the matched entity
84 |
85 | {alt='Column with the identifiers from reconciliation'}
86 |
87 | ## Reconcile country, state, and counties against Wikidata
88 |
89 | The country field contains several alternative ways to indicate the United States of America, including:
90 |
91 | - `US`
92 | - `UNITED STATES`
93 | - `United States of America`
94 |
95 | ::::::::::::::::::::::::::::::::::::::: challenge
96 |
97 | ## Exercise
98 |
99 | If Wikidata does not appear in the list of reconciliation services, add the standard service using the URL: `https://wikidata.reconci.link/en/api`
100 |
101 | - Reconcile the columns `county`, `state`, and `country` using Wikidata.
102 | - If a type does not show in the list, search using the `Reconcile against type` box:
103 | - `country`: `country (Q6256)`
104 | - `state`: `U.S. state (Q35657)`
105 | - `county`: `county of the United States (Q47168)`
106 | - Mouseover the options listed to see a preview of the entity suggested
107 | - For the cells with multiple options, choose one of the suggested values and click the double checkmark button to apply to all cells with the same value
108 | - Click the menu of the `country` column and select `Edit column` > `Add column based on this column...`
109 | - Enter "reconciled\_country" in the field for `New column name`
110 | - In the `Expression` box, enter the following GREL: `cell.recon.best.name`
111 | - Click `OK`
112 |
113 | This will create a new column with the reconciled names for the countries. Create a text facet to see that there is a single name for each country.
114 |
115 | 1. In the cases where OpenRefine did not select a match automatically, are the options relevant?
116 | 2. Why do some cells in the `county` column have many options?
117 |
118 | ::::::::::::::: solution
119 |
120 | ## Solution
121 |
122 | 1. The options may be for the same place, but with different wording, like `Hernando County` for `Hernando`.
123 | 2. Several county names exist in multiple states. You can mouseover each option and find the correct one that matches the state.
124 |
125 | :::::::::::::::::::::::::
126 |
127 | ::::::::::::::::::::::::::::::::::::::::::::::::::
128 |
129 | :::::::::::::::::::::::::::::::::::::::: keypoints
130 |
131 | - OpenRefine can look up existing reconciliation services to enrich data
132 |
133 | ::::::::::::::::::::::::::::::::::::::::::::::::::
134 |
135 |
136 |
--------------------------------------------------------------------------------
/episodes/07-looking-up-data.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Looking Up Data
3 | teaching: 15
4 | exercises: 0
5 | ---
6 |
7 | ::::::::::::::::::::::::::::::::::::::: objectives
8 |
9 | - Use URLs to fetch data from the web based on columns in an OpenRefine project
10 | - Add columns to parse JSON data returned by web services
11 |
12 | ::::::::::::::::::::::::::::::::::::::::::::::::::
13 |
14 | :::::::::::::::::::::::::::::::::::::::: questions
15 |
16 | - How do I fetch data from an Application Programming Interface (API) to be used in OpenRefine?
17 | - How do I reconcile my data by comparing it to authoritative datasets
18 |
19 | ::::::::::::::::::::::::::::::::::::::::::::::::::
20 |
21 | ## Looking up data from a URL
22 |
23 | OpenRefine can retrieve data from URLs. This can be used in various ways, including looking up additional information from a remote service, based on information in your OpenRefine data. As an example, you can look up the scientific names in a dataset against the taxonomy of the Global Biodiversity Information Facility (GBIF), and retrieve additional information such as higher taxonomy and identifiers.
24 |
25 | Typically this is a two step process, firstly a step to retrieve data from a remote service, and secondly to extract the relevant information from the data you have retrieved.
26 |
27 | To retrieve data from an external source, use the drop down menu at any column heading and select `Edit column` > `Add column by fetching URLs...`.
28 |
29 | This will prompt you for a GREL expression to create a URL. This URL will use existing values in your data to build a query. When the query runs OpenRefine will request each URL (for each line) and retrieve whatever data is returned (this may often be structured data, but could be HTML). The data retrieved will be stored in a cell in the new column that has been added to the project. You can then use OpenRefine transformations to extract relevant information from the data that has been retrieved. Two specific OpenRefine functions used for this are:
30 |
31 | - `parseHtml()`
32 | - `parseJson()`
33 |
34 | The `parseHtml()` function can also be used to extract data from XML.
35 |
36 | ### Retrieving higher taxonomy from GBIF
37 |
38 | In this case we are going to use the [GBIF API](https://www.gbif.org/developer/summary). Note that API providers may impose rate limits or have other requirements for using their data, so it's important to check the site's documentation. To reduce the impact on the service, use a value of `500` in the `Throttle Delay` setting to specify the number of milliseconds between requests.
39 |
40 | The syntax for requesting species information from GBIF is `http://api.gbif.org/v1/species/match?name={name}` where {name} is replaced with the scientific name in the dataset.
41 |
42 | - Using the dropdown menu of `scientificName`, select `Edit column` > `Add column by fetching URLs...`
43 |
44 | - In the `New column name` field, enter "gbif\_JSON"
45 |
46 | - In the field for `Throttle delay` enter 500
47 |
48 | - In the expression box type the GREL `"http://api.gbif.org/v1/species/match?name="+escape(value,'url')`
49 |
50 | At this point, your screen should be similar to this:
51 |
52 | {alt='Add column by fetching URLs screen capture'}
53 |
54 | - Click 'OK'
55 |
56 | You should see a message at the top on the OpenRefine screen indicating it is fetching some data, with progress showing the percentage of the proportion of rows of data successfully being fetched. Wait for this to complete.
57 |
58 | At this point you should have a new column containing a long text string in a format called 'JSON' (this stands for JavaScript Object Notation, although very rarely spelt out in full). The results should look like this figure:
59 |
60 | {alt='Example of the results of fetching data from GBIF'}
61 |
62 | OpenRefine has a function for extracting data from JSON (sometimes referred to as 'parsing' the JSON). The `parseJson()` function is explained in more detail at the [Format-based functions page](https://docs.openrefine.org/manual/grelfunctions/#format-based-functions-json-html-xml).
63 |
64 | - In the new column you've just added use the dropdown menu to access `Edit column` > `Add column based on this column...`
65 |
66 | - Add the new column name: "gbif\_family"
67 |
68 | - In the Expression box type the GREL `value.parseJson().get("family")`
69 |
70 | - You should see in the Preview the taxonomic family of the scientific names displays, similar to this screen:
71 |
72 | {alt='Parse JSON to extract taxonomic family'}
73 |
74 | The reason for using `Add column based on this column` is that this allows you to retain the full JSON and extract further data from it if you need to. If you only wanted the taxonomic family and did not need any other information from the JSON you could use `Edit cells` > `Transform...` with the same GREL expression.
75 |
76 | :::::::::::::::::::::::::::::::::::::::: keypoints
77 |
78 | - OpenRefine can look up custom URLs to fetch data based on what's in an OpenRefine project
79 | - Such API calls can be custom built
80 |
81 | ::::::::::::::::::::::::::::::::::::::::::::::::::
82 |
83 |
84 |
--------------------------------------------------------------------------------
/episodes/08-exporting-cleaning-steps.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Exporting Data Cleaning Steps
3 | teaching: 10
4 | exercises: 5
5 | ---
6 |
7 | ::::::::::::::::::::::::::::::::::::::: objectives
8 |
9 | - Describe how OpenRefine generates JSON code.
10 | - Demonstrate ability to export JSON code from OpenRefine.
11 | - Save JSON code from an analysis.
12 | - Apply saved JSON code to an analysis.
13 |
14 | ::::::::::::::::::::::::::::::::::::::::::::::::::
15 |
16 | :::::::::::::::::::::::::::::::::::::::: questions
17 |
18 | - How can we document the data-cleaning steps we've applied to our data?
19 | - How can we apply these steps to additional data sets?
20 |
21 | ::::::::::::::::::::::::::::::::::::::::::::::::::
22 |
23 | ## Export the steps to clean up and enhance the dataset
24 |
25 | As you conduct your data cleaning and preliminary analysis, OpenRefine saves every change you make to the dataset. These
26 | changes are saved in a format known as JSON (JavaScript Object Notation). You can export this JSON script and apply it to other data files. If you had 20 files to clean, and they all had the same type of errors (e.g. species name misspellings, leading white spaces), and all
27 | files had the same column names, you could save the JSON script, open a new file to clean in OpenRefine, paste in the script and run it. This gives you a quick way to clean all of your related data.
28 |
29 | 1. In the `Undo / Redo` section, click `Extract...`, and select the steps that you want to apply to other datasets by clicking the check boxes.
30 | 2. Copy the code from the right hand panel and paste it into a text editor (like NotePad on Windows or TextEdit on Mac). Make sure it saves as a plain text file. In TextEdit, do this by selecting `Format` > `Make plain text` and save the file as a `txt` file.
31 |
32 | Let's practice running these steps on a new dataset. We'll test this on an uncleaned version of the dataset we've been working with.
33 |
34 | ::::::::::::::::::::::::::::::::::::::: challenge
35 |
36 | ## Exercise
37 |
38 | 1. Download an uncleaned version of the dataset from the [Setup](../learners/setup.md) page or use the version of the raw dataset you saved to your computer.
39 | 2. Start a new project in OpenRefine with this file and name it something different from your existing project.
40 | 3. Click the `Undo / Redo` tab > `Apply` and paste in the contents of `txt` file with the JSON code.
41 | 4. Click `Perform operations`. The dataset should now be the same as your other cleaned dataset.
42 |
43 | For convenience, we used the same dataset. In reality you could use this process to clean related datasets. For example, data that you had collected over different fieldwork periods or data that was collected by different researchers (provided everyone uses the same column headings).
44 |
45 |
46 | ::::::::::::::::::::::::::::::::::::::::::::::::::
47 |
48 | ## Reproducible science
49 |
50 | Now, that you know how scripts work, you may wonder how to use them in your own scientific research. For inspiration, you can read more about the succesful application of the reproducible science principles in archaeology or marine ecology:
51 |
52 | 1. Marwick et al. (2017) [Computational Reproducibility in Archaeological Research: Basic Principles and a Case Study of Their Implementation](https://link.springer.com/article/10.1007/s10816-015-9272-9)
53 | 2. Stewart Lowndes et al. (2017) [Our path to better science in less time using open data science tools](https://www.nature.com/articles/s41559-017-0160)
54 |
55 | :::::::::::::::::::::::::::::::::::::::: keypoints
56 |
57 | - All changes are being tracked in OpenRefine, and this information can be used for scripts for future analyses or reproducing an analysis.
58 | - Scripts can (and should) be published together with the dataset as part of the digital appendix of the research output.
59 |
60 | ::::::::::::::::::::::::::::::::::::::::::::::::::
61 |
62 |
63 |
--------------------------------------------------------------------------------
/episodes/09-exporting-data.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Exporting and Saving Data from OpenRefine
3 | teaching: 10
4 | exercises: 0
5 | ---
6 |
7 | ::::::::::::::::::::::::::::::::::::::: objectives
8 |
9 | - Export cleaned data from an OpenRefine project.
10 | - Save an OpenRefine project.
11 |
12 | ::::::::::::::::::::::::::::::::::::::::::::::::::
13 |
14 | :::::::::::::::::::::::::::::::::::::::: questions
15 |
16 | - How can we save and export our cleaned data from OpenRefine?
17 |
18 | ::::::::::::::::::::::::::::::::::::::::::::::::::
19 |
20 | ## Exporting cleaned data
21 |
22 | Once you are done cleaning your data, you will likely want to export it.
23 |
24 | Click `Export` in the top right and select the file type you want to export the data in. `Tab-separated value` (`tsv`) or `Comma-separated value` (`csv`) would be good choices.
25 |
26 | That file will be exported to your default `Downloads` directory. That file can then be opened in a spreadsheet program or imported into programs like R or Python.
27 |
28 | ## Saving and exporting a project
29 |
30 | In OpenRefine you can save or export the project. This means you're saving the data and all the
31 | information about the cleaning and data transformation steps you've done. Once you've saved a project, you can open it up again and be just where you stopped before.
32 |
33 | ### Saving
34 |
35 | By default OpenRefine is saving your project. If you close OpenRefine and open it up again,
36 | you'll see a list of your projects. You can click on any one of them to open it up again.
37 |
38 | To find the location on your computer where the files are saved, see the OpenRefine manual page for [where the data is stored](https://docs.openrefine.org/manual/installing#set-where-data-is-stored).
39 |
40 | ### Exporting project files
41 |
42 | You can also export a project. This is helpful, for instance, if you wanted to send your raw data and cleaning steps to a collaborator, or share this information as a supplement to a publication.
43 |
44 | 1. Click the `Export` button in the top right and select `OpenRefine project archive to file`.
45 | 2. A `tar.gz` file will download to your default `Download` directory. The `tar.gz` extension tells you that this is a compressed file, which means that this file contains multiple files.
46 | 3. If you open the compressed file (if on Windows, you will need a tool like 7-Zip), you should see:
47 |
48 | - A `history` folder which contains several `zip` files. Each of these files itself contains a `change.txt` file.
49 | - These `change.txt` files are the records of each individual transformation that you did to your data.
50 | - A `data.zip` file. When expanded, this `zip` file includes a file called `data.txt` which is a copy of your raw data.
51 | - You may also see other files.
52 |
53 | ### Importing project files
54 |
55 | You can import an existing project into OpenRefine by clicking `Open...` in the upper right, then clicking on `Import Project` on the left-side menu. Click `Choose File` and select the `tar.gz` project file. This project will include all of the raw data and cleaning steps that were part of the original project.
56 |
57 | :::::::::::::::::::::::::::::::::::::::: keypoints
58 |
59 | - OpenRefine can save the clean data to a number of formats.
60 | - Cleaned data or entire projects can be exported from OpenRefine.
61 | - Projects can be shared with collaborators, enabling them to see, reproduce and check all data cleaning steps you performed.
62 |
63 | ::::::::::::::::::::::::::::::::::::::::::::::::::
64 |
65 |
66 |
--------------------------------------------------------------------------------
/episodes/10-resources.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Other Resources in OpenRefine
3 | teaching: 5
4 | exercises: 0
5 | ---
6 |
7 | ::::::::::::::::::::::::::::::::::::::: objectives
8 |
9 | - Explore the online resources available for more information on OpenRefine.
10 | - Identify other resources about OpenRefine.
11 |
12 | ::::::::::::::::::::::::::::::::::::::::::::::::::
13 |
14 | :::::::::::::::::::::::::::::::::::::::: questions
15 |
16 | - What other resources are available for working with OpenRefine?
17 |
18 | ::::::::::::::::::::::::::::::::::::::::::::::::::
19 |
20 | ## Other resources about OpenRefine
21 |
22 | OpenRefine is more than a simple data cleaning tool. People are using it for all sorts of activities. Here are some other resources that might prove useful.
23 |
24 | OpenRefine has documentation and other resources:
25 |
26 | - [OpenRefine web site](https://openrefine.org/)
27 | - [OpenRefine User Manual](https://docs.openrefine.org/)
28 | - [Exploring Facets](https://docs.openrefine.org/manual/facets)
29 | - [Reconciling](https://docs.openrefine.org/manual/reconciling)
30 | - [GREL](https://docs.openrefine.org/manual/grel)
31 | - [Wikibase](https://docs.openrefine.org/manual/wikibase/overview)
32 | - [Troubleshooting](https://docs.openrefine.org/manual/troubleshooting)
33 | - [OpenRefine Blog](https://openrefine.org/category/blog.html)
34 | - [OpenRefine External Resources linked in their Wiki](https://github.com/OpenRefine/OpenRefine/wiki/External-Resources)
35 | - [Recipes in the OpenRefine Wiki](https://github.com/OpenRefine/OpenRefine/wiki/Recipes)
36 |
37 | In addition, see these other useful resources:
38 |
39 | - [Use of OpenRefine with GBIF](https://docs.gbif.org/course-dna-barcoding/course-docs/OpenRefine-Exercise3c-EN.pdf) - PDF guide
40 | - [Getting started with OpenRefine by Thomas Padilla](https://thomaspadilla.org/dataprep/)
41 | - [Cleaning Data with OpenRefine by Seth van Hooland, Ruben Verborgh and Max De Wilde](https://programminghistorian.org/en/lessons/cleaning-data-with-openrefine)
42 | - [Identifying potential headings for Authority work using III Sierra, MS Excel and OpenRefine](https://epublications.marquette.edu/lib_fac/81/)
43 | - [Free your metadata website](https://freeyourmetadata.org/)
44 | - [Cleaning Data with OpenRefine by John Little](https://libjohn.github.io/openrefine/)
45 | - [Grateful Data](https://github.com/scottythered/gratefuldata/wiki) is a fun site with many resources devoted to OpenRefine, including a nice tutorial.
46 |
47 | :::::::::::::::::::::::::::::::::::::::: keypoints
48 |
49 | - Other examples and resources online are good for learning more about OpenRefine
50 |
51 | ::::::::::::::::::::::::::::::::::::::::::::::::::
52 |
53 |
54 |
--------------------------------------------------------------------------------
/episodes/data/Portal_rodents_19772002_simplified.csv:
--------------------------------------------------------------------------------
1 | recordID,species,scientificName,mo,dy,yr,period,plot,note1,stake,locality,coordinates,county,state,country,sex
2 | 6545,AB, Amphispiza bilineata,9,18,1982,62,13,13,36,"Winterthur Gardens, Delaware",,NULL,NULL,UNITED STATES,
3 | 5220,AB, Amphispiza bilineata ,1,24,1982,54,20,13,27,"Winterthur Gardens, Delaware",,NULL,NULL,UNITED STATES,
4 | 7020,AH,Ammospermophilis harrisi,11,21,1982,63,24,13,72,Muscogee-Rerdido [Perdido] River.,30.44972|-87.38167,Escambia,Florida,United States of America,
5 | 7645,AH,Ammospermophilus harrisii,4,16,1983,67,24,13,21,near Lake Lindsey.,28.63444|-82.35944,Hernando,Florida,United States of America,
6 | 8641,AH,Ammospermophilus harrisi,11,13,1983,74,15,13,25,road to St. Mark's lighthouse; St. Mark's Wildlife Refuge.,,Wakulla,Florida,United States of America,
7 | 9495,AH,Ammospermophilus harrisii,8,26,1984,82,9,13,21,3.5 miles north of Allicance Cross Road on Fla. Rt. 71.,,Jackson,Florida,United States of America,
8 | 9583,AH,Ammospermophilus harrisii,9,30,1984,83,15,13,37,"St. Vincent Island, wet swale",,NULL,NULL,UNITED STATES,
9 | 9862,AH,Ammospermophilus harrisii,1,20,1985,86,13,13,11,"Eagle Mountain Trailhead, Clearwater National Forest",46.33778|-115.11639,Idaho,Idaho,UNITED STATES,
10 | 9882,AH,Ammospermophilus harrisii,1,20,1985,86,15,13,31,"Eagle Mountain Trailhead, Clearwater National Forest",46.33778|-115.11639,Idaho,Idaho,UNITED STATES,
11 | 9891,AH,Ammospermophilus harrisii,1,20,1985,86,1,13,43,"Split Creek Trail, Nez Perce National Forest",45.45|-115.91667,Idaho,Idaho,UNITED STATES,
12 | 9939,AH,Ammospermophilus harrisii,2,16,1985,87,20,13,25,"Split Creek Trail, Nez Perce National Forest",45.45|-115.91667,Idaho,Idaho,UNITED STATES,
13 | 10153,AH,Ammospermophilus harrisii,4,20,1985,-88,24,13,15,"Split Creek Trail, Nez Perce National Forest",45.45|-115.91667,Idaho,Idaho,UNITED STATES,
14 | 10450,AH,Ammospermophilus harrisii,6,15,1985,90,19,13,13,"Canyon Creek Trailhead, Clearwater National Forest",45.389905|-114.804434,Idaho,Idaho,UNITED STATES,
15 | 10498,AH,Ammospermophilus harrisii,6,16,1985,90,3,13,24,"FS Rd 25 4.6 mi S of FS Rd 300, Gifford Pinchot National Forest",,Lewis,Washington,UNITED STATES,
16 | 10509,AH,Ammospermophilus harrisii,6,16,1985,90,15,13,33,"FS Rd 25 4.6 mi S of FS Rd 300, Gifford Pinchot National Forest",,Lewis,Washington,UNITED STATES,
17 | 10694,AH,Ammospermophilus harrisii,8,20,1985,92,15,13,33,"FS Rd 25 4.6 mi S of FS Rd 300, Gifford Pinchot National Forest",,Lewis,Washington,UNITED STATES,
18 | 15510,AH,Ammospermophilus harrisii,2,4,1989,131,12,13,27,Copalinga Private Reserve-blue trail (1050m-C),,NULL,Zamora-Chinchipe Province,ECUADOR,
19 | 15588,AH,Ammospermophilus harrisii,2,5,1989,131,7,13,22,Copalinga Private Reserve-blue trail (1050m-C),,NULL,Zamora-Chinchipe Province,ECUADOR,
20 | 15624,AH,Ammospermophilus harrisii,2,5,1989,131,15,13,44,Copalinga Private Reserve-blue trail (1050m-C),,NULL,Zamora-Chinchipe Province,ECUADOR,
21 | 15784,AH,Ammospermophilus harrisii,3,13,1989,132,13,13,76,Copalinga Private Reserve-blue trail (1050m-C),,NULL,Zamora-Chinchipe Province,ECUADOR,
22 | 15950,AH,Ammospermophilus harrisii,4,2,1989,133,20,13,53,Copalinga Private Reserve-blue trail (1050m-C),,NULL,Zamora-Chinchipe Province,ECUADOR,
23 | 15974,AH,Ammospermophilus harrisii,5,9,1989,134,24,13,14,Copalinga Private Reserve-blue trail (1050m-C),,NULL,Zamora-Chinchipe Province,ECUADOR,
24 | 16098,AH,Ammospermophilus harrisii,6,3,1989,135,18,13,16,Copalinga Private Reserve-blue trail (1050m-C),,NULL,Zamora-Chinchipe Province,ECUADOR,
25 | 16121,AH,Ammospermophilus harrisii,6,3,1989,135,18,13,47,Copalinga Private Reserve-blue trail (1050m-C),,NULL,Zamora-Chinchipe Province,ECUADOR,
26 | 16128,AH,Ammospermophilus harrisii,6,3,1989,135,18,13,56,Copalinga Private Reserve-blue trail (1050m-C),,NULL,Zamora-Chinchipe Province,ECUADOR,
27 | 16175,AH,Ammospermophilus harrisii,6,4,1989,135,15,13,34,Copalinga Private Reserve-blue trail (1050m-C),,NULL,Zamora-Chinchipe Province,ECUADOR,
28 | 16184,AH,Ammospermophilus harrisii,6,4,1989,135,15,13,43,Copalinga Private Reserve-blue trail (1050m-C),,NULL,Zamora-Chinchipe Province,ECUADOR,
29 | 16230,AH,Ammospermophilus harrisii,7,3,1989,136,7,13,32,Copalinga Private Reserve-blue trail (1050m-C),,NULL,Zamora-Chinchipe Province,ECUADOR,
30 | 16240,AH,Ammospermophilus harrisii,7,3,1989,136,12,13,51,Copalinga Private Reserve-blue trail (1050m-C),,NULL,Zamora-Chinchipe Province,ECUADOR,
31 | 16242,AH,Ammospermophilus harrisii,7,3,1989,136,7,13,51,Copalinga Private Reserve-blue trail (1050m-C),,NULL,Zamora-Chinchipe Province,ECUADOR,
32 | 16260,AH,Ammospermophilus harrisii,7,3,1989,136,12,13,72,Copalinga Private Reserve-red trail (1420m),,NULL,Zamora-Chinchipe Province,ECUADOR,
33 | 16263,AH,Ammospermophilus harrisii,7,3,1989,136,23,13,73,Copalinga Private Reserve-red trail (1420m),,NULL,Zamora-Chinchipe Province,ECUADOR,
34 | 16288,AH,Ammospermophilus harrisii,7,4,1989,136,15,13,25,Copalinga Private Reserve-red trail (1420m),,NULL,Zamora-Chinchipe Province,ECUADOR,
35 | 16294,AH,Ammospermophilus harrisii,7,4,1989,136,8,13,33,Copalinga Private Reserve-blue trail (1050m-C),,NULL,Zamora-Chinchipe Province,ECUADOR,
36 | 16404,AH,Ammospermophilus harrisii,7,30,1989,137,13,13,61,Copalinga Private Reserve-blue trail (1050m-C),,NULL,Zamora-Chinchipe Province,ECUADOR,
37 | 16481,AH,Ammospermophilus harrisii,9,4,1989,138,14,13,65,Copalinga Private Reserve-blue trail (1050m-C),,NULL,Zamora-Chinchipe Province,ECUADOR,
38 | 16496,AH,Ammospermophilus harrisii,10,7,1989,139,18,13,15,Copalinga Private Reserve-blue trail (1050m-C),,NULL,Zamora-Chinchipe Province,ECUADOR,
39 | 16564,AH,Ammospermophilus harrisii,10,8,1989,139,15,13,45,Copalinga Private Reserve-blue trail (1050m-C),,NULL,Zamora-Chinchipe Province,ECUADOR,
40 | 16572,AH,Ammospermophilus harrisii,10,8,1989,139,13,13,61,Copalinga Private Reserve-blue trail (1050m-C),,NULL,Zamora-Chinchipe Province,ECUADOR,
41 | 16678,AH,Ammospermophilus harrisii,11,5,1989,140,14,13,32,Copalinga Private Reserve-blue trail (1050m-C),,NULL,Zamora-Chinchipe Province,ECUADOR,
42 | 16688,AH,Ammospermophilus harrisii,11,5,1989,140,15,13,42,Copalinga Private Reserve-blue trail (1050m-C),,NULL,Zamora-Chinchipe Province,ECUADOR,
43 | 16901,AH,Ammospermophilus harrisii,1,6,1990,142,12,13,37,Copalinga Private Reserve-blue trail (1050m-C),,NULL,Zamora-Chinchipe Province,ECUADOR,
44 | 17020,AH,Ammospermophilus harrisii,1,29,1990,143,12,13,47,Copalinga Private Reserve-red trail (1420m),,NULL,Zamora-Chinchipe Province,ECUADOR,
45 | 17026,AH,Ammospermophilus harrisii,1,29,1990,143,20,13,52,Copalinga Private Reserve-red trail (1420m),,NULL,Zamora-Chinchipe Province,ECUADOR,
46 | 17204,AH,Ammospermophilus harrisii,2,25,1990,144,14,13,41,Copalinga Private Reserve-red trail (1420m),,NULL,Zamora-Chinchipe Province,ECUADOR,
47 | 17373,AH,Ammospermophilus harrisii,4,24,1990,146,18,13,15,Copalinga Private Reserve-blue trail (1050m-C),,NULL,Zamora-Chinchipe Province,ECUADOR,
48 | 17416,AH,Ammospermophilus harrisii,4,25,1990,146,15,13,25,Copalinga Private Reserve-blue trail (1050m-C),,NULL,Zamora-Chinchipe Province,ECUADOR,
49 | 17488,AH,Ammospermophilus harrisii,5,23,1990,147,18,13,15,Copalinga Private Reserve-blue trail (1050m-C),,NULL,Zamora-Chinchipe Province,ECUADOR,
50 | 17513,AH,Ammospermophilus harrisii,5,24,1990,147,20,13,11,Copalinga Private Reserve-blue trail (1050m-C),,NULL,Zamora-Chinchipe Province,ECUADOR,
51 | 17532,AH,Ammospermophilus harrisii,5,24,1990,147,17,13,53,Reserva Biológica San Francisco-NUMEX (2070m-R2),,NULL,Loja Province,ECUADOR,
52 | 17533,AH,Ammospermophilus harrisii,5,24,1990,147,17,13,54,Reserva Biológica San Francisco-NUMEX (2070m-R2),,NULL,Loja Province,ECUADOR,
53 | 17535,AH,Ammospermophilus harrisii,5,24,1990,147,17,13,55,Reserva Biológica San Francisco-NUMEX (2070m-R2),,NULL,Loja Province,ECUADOR,
54 | 17557,AH,Ammospermophilus harrisii,5,25,1990,147,15,13,26,Reserva Biológica San Francisco-Transect T1 (2070m-R1),,NULL,Loja Province,ECUADOR,
55 | 17577,AH,Ammospermophilus harrisii,5,25,1990,147,6,13,76,Reserva Biológica San Francisco-Transect T1 (2070m-R1),,NULL,Loja Province,ECUADOR,
56 | 17804,AH,Ammospermophilus harrisii,8,17,1990,150,13,13,64,Reserva Biológica San Francisco-Transect T1 (2070m-R1),,NULL,Loja Province,ECUADOR,
57 | 17813,AH,Ammospermophilus harrisii,8,17,1990,150,15,13,74,Reserva Biológica San Francisco-Transect T1 (2070m-R1),,NULL,Loja Province,ECUADOR,
58 | 17828,AH,Ammospermophilus harrisii,9,22,1990,151,7,13,41,Reserva Biológica San Francisco-Transect T1 (2070m-R1),,NULL,Loja Province,ECUADOR,
59 | 17836,AH,Ammospermophilus harrisii,9,22,1990,151,7,13,53,Reserva Biológica San Francisco-Transect T1 (2070m-R1),,NULL,Loja Province,ECUADOR,
60 | 17865,AH,Ammospermophilus harrisii,9,25,1990,151,14,13,45,Reserva Biológica San Francisco-Transect T1 (2070m-R1),,NULL,Loja Province,ECUADOR,
61 | 17897,AH,Ammospermophilus harrisii,10,15,1990,152,12,13,33,Reserva Biológica San Francisco-Transect T1 (2070m-R1),,NULL,Loja Province,ECUADOR,
62 | 17969,AH,Ammospermophilus harrisii,10,17,1990,152,15,13,64,Reserva Biológica San Francisco-Transect T1 (2070m-R1),,NULL,Loja Province,ECUADOR,
63 | 18002,AH,Ammospermophilus harrisii,11,10,1990,153,23,13,51,Reserva Biológica San Francisco-Transect T1 (2070m-R1),,NULL,Loja Province,ECUADOR,
64 | 5204,AB,Amphispiza bilineata,1,24,1982,54,12,13,17,near Lake Lindsey.,28.63444|-82.35944,Hernando,Florida,United States of America,
65 | 5313,AB,Amphispiza bilineata,1,25,1982,54,13,13,63,road to St. Mark's lighthouse; St. Mark's Wildlife Refuge.,,Wakulla,Florida,United States of America,
66 | 5387,AB,Amphispiza bilineata,2,23,1982,55,13,13,12,3.5 miles north of Allicance Cross Road on Fla. Rt. 71.,,Jackson,Florida,United States of America,
67 | 5488,AB,Amphispiza bilineata,2,24,1982,55,2,13,53,"St. Vincent Island, wet swale",,NULL,NULL,UNITED STATES,
68 | 5496,AB,Amphispiza bilineata,2,24,1982,55,2,13,71,"Eagle Mountain Trailhead, Clearwater National Forest",46.33778|-115.11639,Idaho,Idaho,UNITED STATES,
69 | 5535,AB,Amphispiza bilineata,3,29,1982,56,18,13,31,"Eagle Mountain Trailhead, Clearwater National Forest",46.33778|-115.11639,Idaho,Idaho,UNITED STATES,
70 | 5643,AB,Amphispiza bilineata,3,30,1982,56,9,13,44,"Split Creek Trail, Nez Perce National Forest",45.45|-115.91667,Idaho,Idaho,UNITED STATES,
71 | 5687,AB,Amphispiza bilineata,4,28,1982,57,19,13,12,"Split Creek Trail, Nez Perce National Forest",45.45|-115.91667,Idaho,Idaho,UNITED STATES,
72 | 5741,AB,Amphispiza bilineata,4,28,1982,57,20,13,62,"Split Creek Trail, Nez Perce National Forest",45.45|-115.91667,Idaho,Idaho,UNITED STATES,
73 | 5759,AB,Amphispiza bilineata,4,28,1982,57,23,13,77,"Canyon Creek Trailhead, Clearwater National Forest",45.389905|-114.804434,Idaho,Idaho,UNITED STATES,
74 | 5784,AB,Amphispiza bilineata,4,29,1982,57,16,13,34,"FS Rd 25 4.6 mi S of FS Rd 300, Gifford Pinchot National Forest",,Lewis,Washington,UNITED STATES,
75 | 5821,AB,Amphispiza bilineata,4,29,1982,57,3,13,67,"FS Rd 25 4.6 mi S of FS Rd 300, Gifford Pinchot National Forest",,Lewis,Washington,UNITED STATES,
76 | 5899,AB,Amphispiza bilineata,5,21,1982,58,23,13,72,"FS Rd 25 4.6 mi S of FS Rd 300, Gifford Pinchot National Forest",,Lewis,Washington,UNITED STATES,
77 | 6051,AB,Amphispiza bilineata,6,28,1982,59,10,13,74,Upper Hoh Rd 8.3 mi E of US 101,,Jefferson,Washington,UNITED STATES,
78 | 6370,AB,Amphispiza bilineata,8,15,1982,61,6,13,44,Upper Hoh Rd 8.3 mi E of US 101,,Jefferson,Washington,UNITED STATES,
79 | 6377,AB,Amphispiza bilineata,8,15,1982,61,23,13,47,Upper Hoh Rd 8.3 mi E of US 101,,Jefferson,Washington,UNITED STATES,
80 | 6398,AB,Amphispiza bilineata,8,15,1982,61,23,13,62,Upper Hoh Rd 8.3 mi E of US 101,,Jefferson,Washington,UNITED STATES,
81 | 6404,AB,Amphispiza bilineata,8,15,1982,61,23,13,66,"FS Rd 443 0.8 mi S of Selway River Rd, Nez Perce National Forest",46.082289|-115.425324,Idaho,Idaho,UNITED STATES,
82 | 6407,AB,Amphispiza bilineata,8,15,1982,61,23,13,67,"Trib of Meadow Creek, FS Rd 443 2.6 mi S of FS Rd 223, Nez Perce National Forest",45.481902|-115.931183,Idaho,Idaho,UNITED STATES,
83 | 6415,AB,Amphispiza bilineata,8,15,1982,61,23,13,75,"Trib of Meadow Creek, FS Rd 443 2.6 mi S of FS Rd 223, Nez Perce National Forest",45.481902|-115.931183,Idaho,Idaho,UNITED STATES,
84 | 6531,AB,Amphispiza bilineata,9,18,1982,62,9,13,26,"near Red River Hotsprings, Nez Perce National Forest",45.809081|-115.473482,Idaho,Idaho,UNITED STATES,
85 | 6540,AB,Amphispiza bilineata,9,18,1982,62,13,13,32,"Slate Creek Rd 10.2 mi E of US 95, Nez Perce National Forest",45.597618|-115.9427,Idaho,Idaho,UNITED STATES,
86 | 6580,AB,Amphispiza bilineata,9,18,1982,62,6,13,67,"Slate Creek Rd 10.2 mi E of US 95, Nez Perce National Forest",45.597618|-115.9427,Idaho,Idaho,UNITED STATES,
87 | 6724,AB,Amphispiza bilineata,10,23,1982,-62,8,5,51,"Slate Creek Rd 10.2 mi E of US 95, Nez Perce National Forest",45.597618|-115.9427,Idaho,Idaho,UNITED STATES,
88 | 7137,AB,Amphispiza bilineata,1,12,1983,64,20,13,11,Burgdorf Rd 12.4 mi NW of Warren Wagon Rd,45.390995|-115.855953,Idaho,Idaho,UNITED STATES,
89 | 7138,AB,Amphispiza bilineata,1,12,1983,64,20,13,12,Burgdorf Rd 12.4 mi NW of Warren Wagon Rd,45.390995|-115.855953,Idaho,Idaho,UNITED STATES,
90 | 7140,AB,Amphispiza bilineata,1,12,1983,64,24,13,14,Burgdorf Rd 12.4 mi NW of Warren Wagon Rd,45.390995|-115.855953,Idaho,Idaho,UNITED STATES,
91 | 7143,AB,Amphispiza bilineata,1,12,1983,64,20,13,14,FL; Franklin Co.; Apalachicola National Estuarine Sanctuary; near the Marshall House on bayside of island.,,NULL,NULL,UNITED STATES,
92 | 7146,AB,Amphispiza bilineata,1,12,1983,64,12,13,16,FL; Palm Beach Co.; Sand pine scrub just W of DuBois Park on south side of Jupiter Inlet. Naturalized.,,NULL,NULL,UNITED STATES,
93 | 7150,AB,Amphispiza bilineata,1,12,1983,64,20,13,17,"Florida; Pasco County; Just west of Blanton on FLA 41, ca. 2 miles east of US 75",,NULL,NULL,UNITED STATES,
94 | 7151,AB,Amphispiza bilineata,1,12,1983,64,12,13,21,Florida; Leon County; near human habitation but in old hardwood forest with much beech and magnolia in ravine; on Ireland property near the Indian Mounds near Lake Jackson.,,NULL,NULL,UNITED STATES,
95 | 7171,AB,Amphispiza bilineata,1,12,1983,64,20,13,33,"Florida; Leon County; in heavily wooded area, ca 1/2 mile N of entrance to Maclay Gardens State Park, Tallahassee.",,NULL,NULL,UNITED STATES,
96 | 7176,AB,Amphispiza bilineata,1,12,1983,64,20,13,35,"Florida; Leon County; on wooded natural levee by the Apalachicola River, between Jim Woodruff Dam and U.S. Rt. 90 bridge, E of Sneads.",,NULL,NULL,UNITED STATES,
97 | 7180,AB,Amphispiza bilineata,1,12,1983,64,20,13,36,Florida; Leon County; vicinity of the boat landing at the end of Rhoden Cove Road; west of Meridian road; on the SE shore of Lake Jackson; North of Tallahassee.,,NULL,NULL,UNITED STATES,
98 | 7183,AB,Amphispiza bilineata,1,12,1983,64,19,13,42,"Florida; Jefferson County; by E edge of West Lake Rd.; near NE shore of Lake Miccosukee; 1.6 mi. S of jctn. with paved Green Rd.; SW 1/4 of NW 1/4 Sec 6, T2N R4E",,NULL,NULL,UNITED STATES,
99 | 7188,AB,Amphispiza bilineata,1,12,1983,64,20,13,44,"Florida; Franklin County; floodplain of Cow Creek Landing just S of Ochlockonee River, ca. 1 mi E of hiway 319 at terminus of C-370, ca. 4.5 air mi S of town of Sopchoppy.",,NULL,NULL,UNITED STATES,
100 | 7207,AB,Amphispiza bilineata,1,12,1983,64,12,13,55,"Florida; Alachua County; Mixed hardwood forest next to Williston Rd. (Hwy 331), South of Gainesville, FL, about 0.2 miles east of Hwy 121 (SW 34th Street) and 1 mile SW of Hwy 441 (Sec 3, T6S, R19E)",,NULL,NULL,UNITED STATES,
101 | 7303,AB,Amphispiza bilineata,1,13,1983,64,2,13,72,Florida; Leon County; Tallahassee,,NULL,NULL,UNITED STATES,
102 | 7342,AB,Amphispiza bilineata,2,26,1983,65,24,13,37,"at Waikamoi trail, Maui, Hawaii",,NULL,NULL,UNITED STATES,
103 | 7346,AB,Amphispiza bilineata,2,26,1983,65,24,13,46,"at Keopuka, Maui, Hawaii",,NULL,NULL,UNITED STATES,
104 | 7360,AB,Amphispiza bilineata,2,26,1983,65,24,13,67,"at Keanae Arboretum, Maui, Hawaii",,NULL,NULL,UNITED STATES,
105 | 7377,AB,Amphispiza bilineata,2,27,1983,65,13,13,15,Florida; Dade County; in Miami Beach,,NULL,NULL,UNITED STATES,
106 | 7379,AB,Amphispiza bilineata,2,27,1983,65,20,13,16,Florida; Brevard County; Erna Nixon Hammock; property owned by Melbourne Village.,,NULL,NULL,UNITED STATES,
107 | 7397,AB,Amphispiza bilineata,2,27,1983,65,20,13,33,Florida; Martin County; Jonathan Dickinson State Park,,NULL,NULL,UNITED STATES,
108 | 7405,AB,Amphispiza bilineata,2,27,1983,65,23,13,41,Florida; Lee County; Caloosahatchee Regional Park,,NULL,NULL,UNITED STATES,
109 | 7436,AB,Amphispiza bilineata,2,27,1983,65,23,13,66,FL; Franklin Co.; between hiway 98 and the river opposite 3rd Street W in Carrabelle.,,NULL,NULL,UNITED STATES,
110 | 7441,AB,Amphispiza bilineata,2,27,1983,65,3,13,71,FL; Bay Co.; outside fence row bordering roadside dep.,,NULL,NULL,UNITED STATES,
111 | 7465,AB,Amphispiza bilineata,3,14,1983,66,13,13,14,Denkanikota,,Krishnagiri,Tamil Name,INDIA,
112 | 7527,AB,Amphispiza bilineata,3,14,1983,66,13,13,72,"Kings Park & Botanic Garden, Fraser Avenue, West Perth WA 6005",,NULL,NULL,AUSTRALIA,
113 | 7547,AB,Amphispiza bilineata,3,15,1983,66,9,13,13,"Kings Park & Botanic Garden, Fraser Avenue, West Perth WA 6005",,NULL,NULL,AUSTRALIA,
114 | 7550,AB,Amphispiza bilineata,3,15,1983,66,6,13,14,"Kings Park & Botanic Garden, Fraser Avenue, West Perth WA 6005",,NULL,NULL,AUSTRALIA,
115 | 7594,AB,Amphispiza bilineata,3,15,1983,66,2,13,46,"Kings Park & Botanic Garden, Fraser Avenue, West Perth WA 6005",,NULL,NULL,AUSTRALIA,
116 | 7595,AB,Amphispiza bilineata,3,15,1983,66,1,13,47,"Banksia Farm, Pearce Road, Mount Barker, Western Australia",,NULL,NULL,AUSTRALIA,
117 | 7597,AB,Amphispiza bilineata,3,15,1983,66,6,13,47,"Banksia Farm, Pearce Road, Mount Barker, Western Australia",,NULL,NULL,AUSTRALIA,
118 | 7611,AB,Amphispiza bilineata,3,15,1983,66,2,13,63,"Banksia Farm, Pearce Road, Mount Barker, Western Australia",,NULL,NULL,AUSTRALIA,
119 | 7614,AB,Amphispiza bilineata,3,15,1983,66,2,13,64,"Banksia Farm, Pearce Road, Mount Barker, Western Australia",,NULL,NULL,AUSTRALIA,
120 | 7711,AB,Amphispiza bilineata,4,16,1983,67,23,13,76,"Banksia Farm, Pearce Road, Mount Barker, Western Australia",,NULL,NULL,AUSTRALIA,
121 | 7911,AB,Amphispiza bilineata,5,15,1983,68,10,13,53,"Banksia Farm, Pearce Road, Mount Barker, Western Australia",,NULL,NULL,AUSTRALIA,
122 | 8052,AB,Amphispiza bilineata,6,18,1983,69,4,13,77,"Banksia Farm, Pearce Road, Mount Barker, Western Australia",,NULL,NULL,AUSTRALIA,
123 | 8056,AB,Amphispiza bilineata,7,16,1983,70,24,13,12,"Banksia Farm, Pearce Road, Mount Barker, Western Australia",,NULL,NULL,AUSTRALIA,
124 | 8193,AB,Amphispiza bilineata,8,15,1983,71,22,13,55,"Banksia Farm, Pearce Road, Mount Barker, Western Australia",,NULL,NULL,AUSTRALIA,
125 | 8289,AB,Amphispiza bilineata,9,10,1983,72,20,13,23,"Bush, W side of Albany Highway, ca. 50 km N of Mount Barker, N of turn-off to Cranbrook, in neighborhood of Trevelen Farm Winery, Western Australia",,NULL,NULL,AUSTRALIA,
126 | 8403,AB,Amphispiza bilineata,9,11,1983,72,4,13,67,"Bush, W side of Albany Highway, ca. 50 km N of Mount Barker, N of turn-off to Cranbrook, in neighborhood of Trevelen Farm Winery, Western Australia",,NULL,NULL,AUSTRALIA,
127 | 8697,AB,Amphispiza bilineata,12,8,1983,75,20,13,14,,,Franklin,Florida,United States of America,
128 | 8750,AB,Amphispiza bilineata,12,9,1983,75,3,13,12,FL; Lee Co.; hammock forest; west of Bonita Beach.,,NULL,NULL,UNITED STATES,
129 | 8882,AB,Amphispiza bilineata,2,5,1984,76,8,13,27,FL; Franklin Co.; St.Vincent Island,,NULL,NULL,UNITED STATES,
130 | 9015,AB,Amphispiza bilineata,4,9,1984,78,20,13,67,FL; Leon Co.; Elinor Klapp-Phipps Park,,NULL,NULL,UNITED STATES,
131 | 9248,AB,Amphispiza bilineata,5,28,1984,79,7,13,17,"FL; Wakulla Co.; woods; sect 7, T4S, R3W, Tallahassee meridian; 30 mi. sw Tallahassee.",,NULL,NULL,UNITED STATES,
132 | 9287,AB,Amphispiza bilineata,7,3,1984,80,12,13,11,"(Camporee Field) at Wallwood Boy Scout Reservation on Ocklawaha Arm of Lake Talquin, ca. 10 air mi S of Quincy.",30.441776|-84.58333,Gadsden,Florida,United States of America,
133 | 9370,AB,Amphispiza bilineata,7,4,1984,80,3,13,77,FL; Franklin Co.; Tates Hell Swamp; Big Slough Branch of Whiskey George Creek; along North Boundary Rd,,NULL,NULL,UNITED STATES,
134 | 9386,AB,Amphispiza bilineata,7,31,1984,81,6,13,36,"Florida; ; Floating in Withlachoochee River at Istachatta, Florida.",,NULL,NULL,UNITED STATES,
135 | 9389,AB,Amphispiza bilineata,7,31,1984,81,23,13,47,valley,,Siligury,West bengal,INDIA,
136 | 9416,AB,Amphispiza bilineata,8,1,1984,81,2,13,11,FL; Franklin Co.; just N of Avenue B in town of Apalachicola.,,NULL,NULL,UNITED STATES,
137 | 9484,AB,Amphispiza bilineata,8,25,1984,82,6,13,71,"FL; Bay Co.; bordering Moccasin Creek at Blue Springs Road bridge, N of Bennett (1.8 mi S of Rte 20)",,NULL,NULL,UNITED STATES,
138 | 9569,AB,Amphispiza bilineata,9,30,1984,83,15,13,14,"FL; Bay Co.; pasture; just E of Rte 77 on N side of Southport; T2S, R14W, NE1/4 SE1/4 Sec 21",,NULL,NULL,UNITED STATES,
139 | 9602,AB,Amphispiza bilineata,9,30,1984,83,5,13,71,"FL; Manatee Co.; Dunes, Anna Maria Key",,NULL,NULL,UNITED STATES,
140 | 9690,AB,Amphispiza bilineata,10,21,1984,84,1,13,47,"FL; Leon Co.; Elinor Klapp-Phipps Park (W of Meridian Rd, N of Tallahassee)",,NULL,NULL,UNITED STATES,
141 | 9828,AB,Amphispiza bilineata,1,19,1985,86,14,13,43,FL; Franklin Co.; Dog Island; bordering large inland marsh between old dump area and the powerstation.,,NULL,NULL,UNITED STATES,
142 | 9861,AB,Amphispiza bilineata,1,20,1985,86,10,13,11,"FL; Orange Co.; in lowland woods and around clearings of bay forests, east of taxiways at McCoy Field, Orlando.",,NULL,NULL,UNITED STATES,
143 | 9895,AB,Amphispiza bilineata,1,20,1985,86,9,13,45,"FL; Hernando Co.; Along US 41, 2 miles n. of Brooksville; low, grazed meadow at Croom Road; fence row along US 41.",,NULL,NULL,UNITED STATES,
144 | 9941,AB,Amphispiza bilineata,2,16,1985,87,12,13,27,Florida; Gulf County; E side of,,NULL,NULL,UNITED STATES,
145 | 10474,AB,Amphispiza bilineata,6,15,1985,90,22,13,64,Florida; Gulf County; E side of,,NULL,NULL,UNITED STATES,
146 | 10609,AB,Amphispiza bilineata,7,24,1985,91,10,13,53,Florida; Gulf County; E side of,,NULL,NULL,UNITED STATES,
147 | 10765,AB,Amphispiza bilineata,9,21,1985,93,19,13,55,Florida; Gulf County; E side of,,NULL,NULL,UNITED STATES,
148 | 10963,AB,Amphispiza bilineata,11,16,1985,95,12,13,16,Florida; Gulf County; E side of,,NULL,NULL,UNITED STATES,
149 | 10970,AB,Amphispiza bilineata,11,16,1985,95,12,13,24,Florida; Gulf County; E side of,,NULL,NULL,UNITED STATES,
150 | 10975,AB,Amphispiza bilineata,11,16,1985,95,24,13,32,"Damien, Haiti",,NULL,NULL,HT,
151 | 11095,AB,Amphispiza bilineata,12,7,1985,96,12,13,15,"Damien, Haiti",,NULL,NULL,HT,
152 | 11130,AB,Amphispiza bilineata,12,7,1985,96,17,13,61,"Damien, Haiti",,NULL,NULL,HT,
153 | 11200,AB,Amphispiza bilineata,12,8,1985,96,7,13,55,"Damien, Haiti",,NULL,NULL,HT,
154 | 11222,AB,Amphispiza bilineata,12,8,1985,96,7,13,74,"Damien, Haiti",,NULL,NULL,HT,
155 | 11301,AB,Amphispiza bilineata,3,9,1986,97,13,13,31,"New Orleans, La.",,NULL,NULL,US,
156 | 11342,AB,Amphispiza bilineata,4,12,1986,98,6,13,13,"New Orleans, La.",,NULL,NULL,US,
157 | 11449,AB,Amphispiza bilineata,5,10,1986,99,6,13,23,"New Orleans, La.",,NULL,NULL,US,
158 | 11487,AB,Amphispiza bilineata,5,10,1986,99,14,13,75,"New Orleans, La.",,NULL,NULL,US,
159 | 12081,AB,Amphispiza bilineata,12,14,1986,106,16,13,22,"New Orleans, La.",,NULL,NULL,US,
160 | 12211,AB,Amphispiza bilineata,1,31,1987,107,23,13,53,"Port-au-Prince, Haiti",,NULL,NULL,HT,
161 | 12246,AB,Amphispiza bilineata,2,1,1987,107,2,13,16,"Port-au-Prince, Haiti",,NULL,NULL,HT,
162 | 12254,AB,Amphispiza bilineata,2,1,1987,107,13,13,24,"Port-au-Prince, Haiti",,NULL,NULL,HT,
163 | 12260,AB,Amphispiza bilineata,2,1,1987,107,15,13,31,"Port-au-Prince, Haiti",,NULL,NULL,HT,
164 | 12293,AB,Amphispiza bilineata,2,1,1987,107,7,13,64,"Port-au-Prince, Haiti",,NULL,NULL,HT,
165 | 12345,AB,Amphispiza bilineata,3,1,1987,108,20,13,31,"Port-au-Prince, Haiti",,NULL,NULL,HT,
166 | 12354,AB,Amphispiza bilineata,3,1,1987,108,12,13,37,Reserva Biológica San Francisco-Transect T1 (2070m-R1),,NULL,Loja Province,ECUADOR,
167 | 12368,AB,Amphispiza bilineata,3,1,1987,108,12,13,51,Reserva Biológica San Francisco-Transect T1 (2070m-R1),,NULL,Loja Province,ECUADOR,
168 | 12374,AB,Amphispiza bilineata,3,1,1987,108,20,13,62,Reserva Biológica San Francisco-Transect T1 (2070m-R1),,NULL,Loja Province,ECUADOR,
169 | 12382,AB,Amphispiza bilineata,3,1,1987,108,23,13,67,Bombuscaro - Podocarpus National Park (1050m-B),,NULL,Zamora-Chinchipe Province,ECUADOR,
170 | 12387,AB,Amphispiza bilineata,3,1,1987,108,14,13,76,Bombuscaro - Podocarpus National Park (1050m-B),,NULL,Zamora-Chinchipe Province,ECUADOR,
171 | 12405,AB,Amphispiza bilineata,3,2,1987,108,3,13,16,Bombuscaro - Podocarpus National Park (1050m-B),,NULL,Zamora-Chinchipe Province,ECUADOR,
172 | 12418,AB,Amphispiza bilineata,3,2,1987,108,7,13,27,Copalinga Private Reserve-blue trail (1050m-C),,NULL,Zamora-Chinchipe Province,ECUADOR,
173 | 12444,AB,Amphispiza bilineata,3,2,1987,108,7,13,51,Copalinga Private Reserve-blue trail (1050m-C),,NULL,Zamora-Chinchipe Province,ECUADOR,
174 | 12510,AB,Amphispiza bilineata,4,4,1987,109,20,13,51,Copalinga Private Reserve-blue trail (1050m-C),,NULL,Zamora-Chinchipe Province,ECUADOR,
175 | 12525,AB,Amphispiza bilineata,4,4,1987,109,16,13,71,Copalinga Private Reserve-blue trail (1050m-C),,NULL,Zamora-Chinchipe Province,ECUADOR,
176 | 12537,AB,Amphispiza bilineata,4,6,1987,109,9,13,13,Copalinga Private Reserve-blue trail (1050m-C),,NULL,Zamora-Chinchipe Province,ECUADOR,
177 | 12542,AB,Amphispiza bilineata,4,6,1987,109,15,13,15,Copalinga Private Reserve-blue trail (1050m-C),,NULL,Zamora-Chinchipe Province,ECUADOR,
178 | 12575,AB,Amphispiza bilineata,4,6,1987,109,15,13,45,Copalinga Private Reserve-blue trail (1050m-C),,NULL,Zamora-Chinchipe Province,ECUADOR,
179 | 12594,AB,Amphispiza bilineata,4,6,1987,109,15,13,65,Copalinga Private Reserve-blue trail (1050m-C),,NULL,Zamora-Chinchipe Province,ECUADOR,
180 | 12600,AB,Amphispiza bilineata,4,6,1987,109,15,13,67,Copalinga Private Reserve-blue trail (1050m-C),,NULL,Zamora-Chinchipe Province,ECUADOR,
181 | 12669,AB,Amphispiza bilineata,4,25,1987,110,24,13,77,Copalinga Private Reserve-blue trail (1050m-C),,NULL,Zamora-Chinchipe Province,ECUADOR,
182 | 12768,AB,Amphispiza bilineata,5,28,1987,111,16,13,23,Copalinga Private Reserve-blue trail (1050m-C),,NULL,Zamora-Chinchipe Province,ECUADOR,
183 | 12794,AB,Amphispiza bilineata,5,28,1987,111,24,13,36,Copalinga Private Reserve-blue trail (1050m-C),,NULL,Zamora-Chinchipe Province,ECUADOR,
184 | 12884,AB,Amphispiza bilineata,5,28,1987,111,8,13,77,Copalinga Private Reserve-blue trail (1050m-C),,NULL,Zamora-Chinchipe Province,ECUADOR,
185 | 13321,AB,Amphispiza bilineata,8,26,1987,114,2,13,65,Copalinga Private Reserve-blue trail (1050m-C),,NULL,Zamora-Chinchipe Province,ECUADOR,
186 | 13328,AB,Amphispiza bilineata,8,26,1987,114,3,13,72,Copalinga Private Reserve-blue trail (1050m-C),,NULL,Zamora-Chinchipe Province,ECUADOR,
187 | 13442,AB,Amphispiza bilineata,9,27,1987,115,7,13,37,Copalinga Private Reserve-red trail (1420m),,NULL,Zamora-Chinchipe Province,ECUADOR,
188 | 13636,AB,Amphispiza bilineata,10,25,1987,116,13,13,74,Copalinga Private Reserve-red trail (1420m),,NULL,Zamora-Chinchipe Province,ECUADOR,
189 | 13659,AB,Amphispiza bilineata,11,21,1987,117,6,13,16,Copalinga Private Reserve-red trail (1420m),,NULL,Zamora-Chinchipe Province,ECUADOR,
190 | 13684,AB,Amphispiza bilineata,11,21,1987,117,12,13,41,Copalinga Private Reserve-blue trail (1050m-C),,NULL,Zamora-Chinchipe Province,ECUADOR,
191 | 13775,AB,Amphispiza bilineata,11,22,1987,117,7,13,35,Copalinga Private Reserve-blue trail (1050m-C),,NULL,Zamora-Chinchipe Province,ECUADOR,
192 | 13790,AB,Amphispiza bilineata,11,22,1987,117,7,13,45,Copalinga Private Reserve-blue trail (1050m-C),,NULL,Zamora-Chinchipe Province,ECUADOR,
193 | 13829,AB,Amphispiza bilineata,11,22,1987,117,13,13,73,Copalinga Private Reserve-blue trail (1050m-C),,NULL,Zamora-Chinchipe Province,ECUADOR,
194 | 13832,AB,Amphispiza bilineata,11,22,1987,117,15,13,74,Copalinga Private Reserve-blue trail (1050m-C),,NULL,Zamora-Chinchipe Province,ECUADOR,
195 | 13856,AB,Amphispiza bilineata,1,23,1988,118,21,13,25,Copalinga Private Reserve-blue trail (1050m-C),,NULL,Zamora-Chinchipe Province,ECUADOR,
196 | 13897,AB,Amphispiza bilineata,1,23,1988,118,24,13,67,Copalinga Private Reserve-blue trail (1050m-C),,NULL,Zamora-Chinchipe Province,ECUADOR,
197 | 13901,AB,Amphispiza bilineata,1,23,1988,118,17,13,73,Copalinga Private Reserve-blue trail (1050m-C),,NULL,Zamora-Chinchipe Province,ECUADOR,
198 | 13923,AB,Amphispiza bilineata,1,24,1988,118,13,13,13,Copalinga Private Reserve-blue trail (1050m-C),,NULL,Zamora-Chinchipe Province,ECUADOR,
199 | 13979,AB,Amphispiza bilineata,1,24,1988,118,13,13,64,Copalinga Private Reserve-red trail (1420m),,NULL,Zamora-Chinchipe Province,ECUADOR,
200 | 14008,AB,Amphispiza bilineata,2,21,1988,119,12,13,11,Copalinga Private Reserve-red trail (1420m),,NULL,Zamora-Chinchipe Province,ECUADOR,
201 | 14010,AB,Amphispiza bilineata,2,21,1988,119,24,13,12,Copalinga Private Reserve-red trail (1420m),,NULL,Zamora-Chinchipe Province,ECUADOR,
202 | 14016,AB,Amphispiza bilineata,2,21,1988,119,21,13,16,Copalinga Private Reserve-blue trail (1050m-C),,NULL,Zamora-Chinchipe Province,ECUADOR,
203 | 14017,AB,Amphispiza bilineata,2,21,1988,119,19,13,16,Copalinga Private Reserve-blue trail (1050m-C),,NULL,Zamora-Chinchipe Province,ECUADOR,
204 | 14034,AB,Amphispiza bilineata,2,21,1988,119,23,13,33,Copalinga Private Reserve-blue trail (1050m-C),,NULL,Zamora-Chinchipe Province,ECUADOR,
205 | 14039,AB,Amphispiza bilineata,2,21,1988,119,22,13,37,Copalinga Private Reserve-blue trail (1050m-C),,NULL,Zamora-Chinchipe Province,ECUADOR,
206 | 14054,AB,Amphispiza bilineata,2,21,1988,119,23,13,51,Reserva Biológica San Francisco-NUMEX (2070m-R2),,NULL,Loja Province,ECUADOR,
207 | 14055,AB,Amphispiza bilineata,2,21,1988,119,23,13,53,Reserva Biológica San Francisco-NUMEX (2070m-R2),,NULL,Loja Province,ECUADOR,
208 | 14060,AB,Amphispiza bilineata,2,21,1988,119,12,13,54,Reserva Biológica San Francisco-NUMEX (2070m-R2),,NULL,Loja Province,ECUADOR,
209 | 14072,AB,Amphispiza bilineata,2,21,1988,119,23,13,63,Reserva Biológica San Francisco-Transect T1 (2070m-R1),,NULL,Loja Province,ECUADOR,
210 | 14073,AB,Amphispiza bilineata,2,21,1988,119,1,13,64,Reserva Biológica San Francisco-Transect T1 (2070m-R1),,NULL,Loja Province,ECUADOR,
211 | 14077,AB,Amphispiza bilineata,2,21,1988,119,12,13,66,Reserva Biológica San Francisco-Transect T1 (2070m-R1),,NULL,Loja Province,ECUADOR,
212 | 14078,AB,Amphispiza bilineata,2,21,1988,119,1,13,67,Reserva Biológica San Francisco-Transect T1 (2070m-R1),,NULL,Loja Province,ECUADOR,
213 | 14083,AB,Amphispiza bilineata,2,21,1988,119,12,13,71,Reserva Biológica San Francisco-Transect T1 (2070m-R1),,NULL,Loja Province,ECUADOR,
214 | 14087,AB,Amphispiza bilineata,2,21,1988,119,1,13,73,Reserva Biológica San Francisco-Transect T1 (2070m-R1),,NULL,Loja Province,ECUADOR,
215 | 14090,AB,Amphispiza bilineata,2,21,1988,119,6,13,74,Reserva Biológica San Francisco-Transect T1 (2070m-R1),,NULL,Loja Province,ECUADOR,
216 | 14106,AB,Amphispiza bilineata,2,22,1988,119,14,13,14,Reserva Biológica San Francisco-Transect T1 (2070m-R1),,NULL,Loja Province,ECUADOR,
217 | 14122,AB,Amphispiza bilineata,2,22,1988,119,3,13,22,Reserva Biológica San Francisco-Transect T1 (2070m-R1),,NULL,Loja Province,ECUADOR,
218 | 14156,AB,Amphispiza bilineata,2,22,1988,119,10,13,47,Reserva Biológica San Francisco-Transect T1 (2070m-R1),,NULL,Loja Province,ECUADOR,
219 | 14158,AB,Amphispiza bilineata,2,22,1988,119,2,13,51,Reserva Biológica San Francisco-Transect T1 (2070m-R1),,NULL,Loja Province,ECUADOR,
220 | 14182,AB,Amphispiza bilineata,2,22,1988,119,9,13,73,Reserva Biológica San Francisco-Transect T1 (2070m-R1),,NULL,Loja Province,ECUADOR,
221 | 14196,AB,Amphispiza bilineata,3,20,1988,120,24,13,15,Copalinga Private Reserve-red trail (1420m),,NULL,Zamora-Chinchipe Province,ECUADOR,
222 | 14213,AB,Amphispiza bilineata,3,20,1988,120,12,13,31,Copalinga Private Reserve-red trail (1420m),,NULL,Zamora-Chinchipe Province,ECUADOR,
223 | 14223,AB,Amphispiza bilineata,3,20,1988,120,18,13,37,Copalinga Private Reserve-red trail (1420m),,NULL,Zamora-Chinchipe Province,ECUADOR,
224 | 14224,AB,Amphispiza bilineata,3,20,1988,120,19,13,42,Copalinga Private Reserve-red trail (1420m),,NULL,Zamora-Chinchipe Province,ECUADOR,
225 | 14233,AB,Amphispiza bilineata,3,20,1988,120,18,13,56,Copalinga Private Reserve-red trail (1420m),,NULL,Zamora-Chinchipe Province,ECUADOR,
226 | 14278,AB,Amphispiza bilineata,3,21,1988,120,8,13,22,Copalinga Private Reserve-red trail (1420m),,NULL,Zamora-Chinchipe Province,ECUADOR,
227 | 14298,AB,Amphispiza bilineata,3,21,1988,120,3,13,41,Copalinga Private Reserve-red trail (1420m),,NULL,Zamora-Chinchipe Province,ECUADOR,
228 | 15030,AB,Amphispiza bilineata,11,5,1988,128,20,13,11,Copalinga Private Reserve-red trail (1420m),,NULL,Zamora-Chinchipe Province,ECUADOR,
229 | 15229,AB,Amphispiza bilineata,12,14,1988,129,13,13,15,Copalinga Private Reserve-red trail (1420m),,NULL,Zamora-Chinchipe Province,ECUADOR,
230 | 15247,AB,Amphispiza bilineata,12,14,1988,129,13,13,31,Copalinga Private Reserve-red trail (1420m),,NULL,Zamora-Chinchipe Province,ECUADOR,
231 | 15263,AB,Amphispiza bilineata,12,14,1988,129,15,13,43,Copalinga Private Reserve-red trail (1420m),,NULL,Zamora-Chinchipe Province,ECUADOR,
232 | 15276,AB,Amphispiza bilineata,12,14,1988,129,13,13,51,Copalinga Private Reserve-red trail (1420m),,NULL,Zamora-Chinchipe Province,ECUADOR,
233 | 15277,AB,Amphispiza bilineata,12,14,1988,129,15,13,52,Copalinga Private Reserve-red trail (1420m),,NULL,Zamora-Chinchipe Province,ECUADOR,
234 | 15312,AB,Amphispiza bilineata,1,10,1989,130,12,13,14,Copalinga Private Reserve-red trail (1420m),,NULL,Zamora-Chinchipe Province,ECUADOR,
235 | 15314,AB,Amphispiza bilineata,1,10,1989,130,6,13,15,Copalinga Private Reserve-red trail (1420m),,NULL,Zamora-Chinchipe Province,ECUADOR,
236 | 15315,AB,Amphispiza bilineata,1,10,1989,130,24,13,17,Copalinga Private Reserve-red trail (1420m),,NULL,Zamora-Chinchipe Province,ECUADOR,
237 | 15341,AB,Amphispiza bilineata,1,10,1989,130,22,13,43,Copalinga Private Reserve-red trail (1420m),,NULL,Zamora-Chinchipe Province,ECUADOR,
238 | 15353,AB,Amphispiza bilineata,1,10,1989,130,16,13,51,Copalinga Private Reserve-red trail (1420m),,NULL,Zamora-Chinchipe Province,ECUADOR,
239 | 15356,AB,Amphispiza bilineata,1,10,1989,130,17,13,56,Copalinga Private Reserve-red trail (1420m),,NULL,Zamora-Chinchipe Province,ECUADOR,
240 | 15386,AB,Amphispiza bilineata,1,11,1989,130,14,13,12,Reserva Biológica San Francisco-NUMEX (2070m-R2),,NULL,Loja Province,ECUADOR,
241 | 15426,AB,Amphispiza bilineata,1,11,1989,130,8,13,41,Reserva Biológica San Francisco-NUMEX (2070m-R2),,NULL,Loja Province,ECUADOR,
242 | 15429,AB,Amphispiza bilineata,1,11,1989,130,14,13,42,Reserva Biológica San Francisco-NUMEX (2070m-R2),,NULL,Loja Province,ECUADOR,
243 | 15432,AB,Amphispiza bilineata,1,11,1989,130,7,13,45,Copalinga Private Reserve-red trail (1420m),,NULL,Zamora-Chinchipe Province,ECUADOR,
244 | 15461,AB,Amphispiza bilineata,1,11,1989,130,13,13,65,Copalinga Private Reserve-red trail (1420m),,NULL,Zamora-Chinchipe Province,ECUADOR,
245 | 15475,AB,Amphispiza bilineata,1,11,1989,130,7,13,73,Copalinga Private Reserve-red trail (1420m),,NULL,Zamora-Chinchipe Province,ECUADOR,
246 | 15488,AB,Amphispiza bilineata,2,4,1989,131,20,13,11,Copalinga Private Reserve-red trail (1420m),,NULL,Zamora-Chinchipe Province,ECUADOR,
247 | 15738,AB,Amphispiza bilineata,3,13,1989,132,21,13,22,Copalinga Private Reserve-red trail (1420m),,NULL,Zamora-Chinchipe Province,ECUADOR,
248 | 15767,AB,Amphispiza bilineata,3,13,1989,132,18,13,57,Copalinga Private Reserve-red trail (1420m),,NULL,Zamora-Chinchipe Province,ECUADOR,
249 | 15803,AB,Amphispiza bilineata,3,14,1989,132,9,13,23,Copalinga Private Reserve-red trail (1420m),,NULL,Zamora-Chinchipe Province,ECUADOR,
250 | 16525,AB,Amphispiza bilineata,10,7,1989,139,18,13,61,Copalinga Private Reserve-red trail (1420m),,NULL,Zamora-Chinchipe Province,ECUADOR,
251 | 16557,AB,Amphispiza bilineata,10,8,1989,139,12,13,35,Copalinga Private Reserve-red trail (1420m),,NULL,Zamora-Chinchipe Province,ECUADOR,
252 | 16566,AB,Amphispiza bilineata,10,8,1989,139,7,13,52,Copalinga Private Reserve-red trail (1420m),,NULL,Zamora-Chinchipe Province,ECUADOR,
253 | 16611,AB,Amphispiza bilineata,11,4,1989,140,21,13,31,Copalinga Private Reserve-red trail (1350m),,NULL,Zamora-Chinchipe Province,ECUADOR,
254 | 16618,AB,Amphispiza bilineata,11,4,1989,140,21,13,37,Copalinga Private Reserve-red trail (1350m),,NULL,Zamora-Chinchipe Province,ECUADOR,
255 | 16691,AB,Amphispiza bilineata,11,5,1989,140,11,13,44,Copalinga Private Reserve-red trail (1350m),,NULL,Zamora-Chinchipe Province,ECUADOR,
256 | 16732,AB,Amphispiza bilineata,12,4,1989,141,19,13,14,FL; Leon Co.; ditch along Domingo Avenue near corner of Solano Avenue in Tallahassee,,NULL,NULL,UNITED STATES,
257 | 16739,AB,Amphispiza bilineata,12,4,1989,141,23,13,21,FL; Leon Co.; ditch along Domingo Avenue near corner of Solano Avenue in Tallahassee,,NULL,NULL,UNITED STATES,
258 | 16759,AB,Amphispiza bilineata,12,4,1989,141,6,13,37,"FL; Monroe Co.; weedy vacant waterfront lot, Key West.",,NULL,NULL,UNITED STATES,
259 | 16769,AB,Amphispiza bilineata,12,4,1989,141,7,13,45,"ca. 20 km N of Kojonup, Western Australia",,NULL,NULL,AUSTRALIA,
260 | 16771,AB,Amphispiza bilineata,12,4,1989,141,18,13,47,"ca. 20 km N of Kojonup, Western Australia",,NULL,NULL,AUSTRALIA,
261 | 16772,AB,Amphispiza bilineata,12,4,1989,141,12,13,47,"ca. 20 km N of Kojonup, Western Australia",,NULL,NULL,AUSTRALIA,
262 | 16777,AB,Amphispiza bilineata,12,4,1989,141,7,13,55,"ca. 20 km N of Kojonup, Western Australia",,NULL,NULL,AUSTRALIA,
263 | 16808,AB,Amphispiza bilineata,12,5,1989,141,10,13,13,"ca. 20 km N of Kojonup, Western Australia",,NULL,NULL,AUSTRALIA,
264 | 16846,AB,Amphispiza bilineata,12,5,1989,141,3,13,45,"ca. 20 km N of Kojonup, Western Australia",,NULL,NULL,AUSTRALIA,
265 | 16892,AB,Amphispiza bilineata,1,6,1990,142,21,13,23,"Bush on Hi-Vallee Farm, Tootbardi Road, Badgingarra, Western Australia 6521",,NULL,NULL,AUSTRALIA,
266 | 270,DM,Dipodomys merriami,10,16,1977,4,1,,56,,,,,,F
267 | 273,DM,Dipodomys merriami,10,16,1977,4,9,,61,,,,,,M
268 | 275,DM,Dipodomys merriami,10,16,1977,4,20,,62,,,,,,M
269 | 280,DM,Dipodomys merriami,10,16,1977,4,18,,67,,,,,,M
270 | 283,DM,Dipodomys merriami,10,16,1977,4,6,,74,,,,,,M
271 | 284,DM,Dipodomys merriami,10,16,1977,4,13,,74,,,,,,M
272 | 285,DM,Dipodomys merriami,10,16,1977,4,1,,75,,,,,,M
273 | 287,DM,Dipodomys merriami,10,17,1977,4,17,,11,,,,,,M
274 | 288,DM,Dipodomys merriami,10,17,1977,4,17,,14,,,,,,M
275 | 289,DM,Dipodomys merriami,10,17,1977,4,14,,15,,,,,,M
276 | 290,DM,Dipodomys merriami,10,17,1977,4,17,,15,,,,,,F
277 | 293,DM,Dipodomys merriami,10,17,1977,4,4,,23,,,,,,F
278 | 295,DM,Dipodomys merriami,10,17,1977,4,11,,24,,,,,,M
279 | 298,DM,Dipodomys merriami,10,17,1977,4,19,,26,,,,,,M
280 | 302,DM,Dipodomys merriami,10,17,1977,4,19,,35,,,,,,F
281 | 303,DM,Dipodomys merriami,10,17,1977,4,3,,36,,,,,,M
282 | 304,DM,Dipodomys merriami,10,17,1977,4,21,,41,,,,,,M
283 | 305,DM,Dipodomys merriami,10,17,1977,4,14,,42,,,,,,F
284 | 306,DM,Dipodomys merriami,10,17,1977,4,16,,42,,,,,,M
285 | 307,DM,Dipodomys merriami,10,17,1977,4,19,,46,,,,,,M
286 | 312,DM,Dipodomys merriami,10,17,1977,4,11,,53,,,,,,F
287 | 313,DM,Dipodomys merriami,10,17,1977,4,19,,53,,,,,,M
288 | 315,DM,Dipodomys merriami,10,17,1977,4,3,,62,,,,,,M
289 | 316,DM,Dipodomys merriami,10,17,1977,4,15,,62,,,,,,M
290 | 318,DM,Dipodomys merriami,10,17,1977,4,17,,66,,,,,,M
291 | 319,DM,Dipodomys merriami,10,17,1977,4,14,,72,,,,,,M
292 | 320,DM,Dipodomys merriami,10,17,1977,4,17,,72,,,,,,F
293 | 328,DM,Dipodomys merriami,10,18,1977,4,16,,11,,,,,,F
294 | 330,DM,Dipodomys merriami,10,18,1977,4,5,,21,,,,,,M
295 | 334,DM,Dipodomys merriami,10,18,1977,4,5,,24,,,,,,F
296 | 336,DM,Dipodomys merriami,10,18,1977,4,12,,27,,,,,,M
297 | 338,DM,Dipodomys merriami,10,18,1977,4,12,,51,,,,,,M
298 | 340,DM,Dipodomys merriami,10,18,1977,4,12,,54,,,,,,F
299 | 342,DM,Dipodomys merriami,10,18,1977,4,16,,57,,,,,,M
300 | 345,DM,Dipodomys merriami,11,12,1977,5,22,,11,,,,,,F
301 | 346,DM,Dipodomys merriami,11,12,1977,5,2,,13,,,,,,F
302 | 347,DM,Dipodomys merriami,11,12,1977,5,6,,14,,,,,,F
303 | 348,DM,Dipodomys merriami,11,12,1977,5,13,,14,,,,,,M
304 | 350,DM,Dipodomys merriami,11,12,1977,5,2,,17,,,,,,M
305 | 352,DM,Dipodomys merriami,11,12,1977,5,1,,23,,,,,,M
306 | 354,DM,Dipodomys merriami,11,12,1977,5,2,,34,,,,,,M
307 | 359,DM,Dipodomys merriami,11,12,1977,5,18,,43,,,,,,M
308 | 360,DM,Dipodomys merriami,11,12,1977,5,20,,43,,,,,,F
309 | 361,DM,Dipodomys merriami,11,12,1977,5,2,,47,,,,,,F
310 | 364,DM,Dipodomys merriami,11,12,1977,5,9,,54,,,,,,M
311 | 365,DM,Dipodomys merriami,11,12,1977,5,1,,56,,,,,,F
312 | 369,DM,Dipodomys merriami,11,12,1977,5,20,,57,,,,,,F
313 | 370,DM,Dipodomys merriami,11,12,1977,5,9,,61,,,,,,M
314 | 371,DM,Dipodomys merriami,11,12,1977,5,13,,62,,,,,,M
315 | 372,DM,Dipodomys merriami,11,12,1977,5,22,,62,,,,,,F
316 | 373,DM,Dipodomys merriami,11,12,1977,5,6,,64,,,,,,M
317 | 374,DM,Dipodomys merriami,11,12,1977,5,18,,65,,,,,,M
318 | 379,DM,Dipodomys merriami,11,13,1977,5,14,,12,,,,,,M
319 | 380,DM,Dipodomys merriami,11,13,1977,5,17,,15,,,,,,F
320 | 382,DM,Dipodomys merriami,11,13,1977,5,17,,21,,,,,,M
321 | 384,DM,Dipodomys merriami,11,13,1977,5,11,,31,,,,,,M
322 | 388,DM,Dipodomys merriami,11,13,1977,5,11,,45,,,,,,F
323 | 395,DM,Dipodomys merriami,11,13,1977,5,14,,63,,,,,,M
324 | 396,DM,Dipodomys merriami,11,13,1977,5,14,,64,,,,,,F
325 | 399,DM,Dipodomys merriami,11,13,1977,5,17,,72,,,,,,F
326 | 404,DM,Dipodomys merriami,11,14,1977,5,12,,17,,,,,,M
327 | 409,DM,Dipodomys merriami,11,14,1977,5,12,,33,,,,,,F
328 | 411,DM,Dipodomys merriami,11,14,1977,5,5,,52,,,,,,M
329 | 415,DM,Dipodomys merriami,11,14,1977,5,5,,66,,,,,,F
330 | 420,DM,Dipodomys merriami,12,10,1977,6,13,,11,,,,,,F
331 | 422,DM,Dipodomys merriami,12,10,1977,6,2,,13,,,,,,F
332 | 423,DM,Dipodomys merriami,12,10,1977,6,13,,15,,,,,,M
333 | 424,DM,Dipodomys merriami,12,10,1977,6,2,,16,,,,,,M
334 | 425,DM,Dipodomys merriami,12,10,1977,6,20,,17,,,,,,F
335 | 426,DM,Dipodomys merriami,12,10,1977,6,22,,17,,,,,,M
336 | 427,DM,Dipodomys merriami,12,10,1977,6,2,,22,,,,,,F
337 | 429,DM,Dipodomys merriami,12,10,1977,6,1,,24,,,,,,M
338 | 433,DM,Dipodomys merriami,12,10,1977,6,9,,34,,,,,,M
339 | 436,DM,Dipodomys merriami,12,10,1977,6,18,,47,,,,,,F
340 | 437,DM,Dipodomys merriami,12,10,1977,6,18,,52,,,,,,F
341 | 438,DM,Dipodomys merriami,12,10,1977,6,2,,53,,,,,,M
342 | 439,DM,Dipodomys merriami,12,10,1977,6,20,,53,,,,,,F
343 | 443,DM,Dipodomys merriami,12,10,1977,6,13,,63,,,,,,M
344 | 444,DM,Dipodomys merriami,12,10,1977,6,6,,64,,,,,,M
345 | 447,DM,Dipodomys merriami,12,10,1977,6,18,,67,,,,,,M
346 | 449,DM,Dipodomys merriami,12,10,1977,6,2,,71,,,,,,M
347 | 453,DM,Dipodomys merriami,12,10,1977,6,9,,76,,,,,,M
348 | 454,DM,Dipodomys merriami,12,10,1977,6,1,,77,,,,,,F
349 | 461,DM,Dipodomys merriami,12,11,1977,6,14,,12,,,,,,M
350 | 462,DM,Dipodomys merriami,12,11,1977,6,17,,13,,,,,,M
351 | 468,DM,Dipodomys merriami,12,11,1977,6,11,,22,,,,,,M
352 | 479,DM,Dipodomys merriami,12,11,1977,6,14,,34,,,,,,F
353 | 481,DM,Dipodomys merriami,12,11,1977,6,17,,36,,,,,,F
354 | 482,DM,Dipodomys merriami,12,11,1977,6,17,,41,,,,,,M
355 | 484,DM,Dipodomys merriami,12,11,1977,6,11,,43,,,,,,F
356 | 487,DM,Dipodomys merriami,12,11,1977,6,12,,54,,,,,,F
357 | 488,DM,Dipodomys merriami,12,11,1977,6,12,,56,,,,,,M
358 | 490,DM,Dipodomys merriami,12,11,1977,6,14,,63,,,,,,M
359 | 496,DM,Dipodomys merriami,12,11,1977,6,17,,71,,,,,,F
360 | 502,DM,Dipodomys merriami,12,11,1977,6,5,,77,,,,,,F
361 | 505,DM,Dipodomys merriami,1,8,1978,7,13,,13,,,,,,M
362 | 507,DM,Dipodomys merriami,1,8,1978,7,2,,17,,,,,,M
363 | 508,DM,Dipodomys merriami,1,8,1978,7,20,,17,,,,,,F
364 | 511,DM,Dipodomys merriami,1,8,1978,7,2,,25,,,,,,M
365 | 516,DM,Dipodomys merriami,1,8,1978,7,9,,43,,,,,,M
366 | 518,DM,Dipodomys merriami,1,8,1978,7,2,,47,,,,,,M
367 | 519,DM,Dipodomys merriami,1,8,1978,7,2,,54,,,,,,M
368 | 521,DM,Dipodomys merriami,1,8,1978,7,2,,55,,,,,,M
369 | 522,DM,Dipodomys merriami,1,8,1978,7,2,,61,,,,,,F
370 | 523,DM,Dipodomys merriami,1,8,1978,7,2,,62,,,,,,M
371 | 524,DM,Dipodomys merriami,1,8,1978,7,20,,62,,,,,,
372 | 525,DM,Dipodomys merriami,1,8,1978,7,6,,64,,,,,,M
373 | 527,DM,Dipodomys merriami,1,8,1978,7,2,,66,,,,,,F
374 | 529,DM,Dipodomys merriami,1,8,1978,7,9,,67,,,,,,M
375 | 530,DM,Dipodomys merriami,1,8,1978,7,13,,74,,,,,,M
376 | 533,DM,Dipodomys merriami,1,8,1978,7,2,,76,,,,,,M
377 | 538,DM,Dipodomys merriami,1,9,1978,7,17,,14,,,,,,M
378 | 539,DM,Dipodomys merriami,1,9,1978,7,17,,16,,,,,,F
379 | 541,DM,Dipodomys merriami,1,9,1978,7,11,,31,,,,,,M
380 | 542,DM,Dipodomys merriami,1,9,1978,7,1,,32,,,,,,M
381 | 545,DM,Dipodomys merriami,1,9,1978,7,1,,36,,,,,,F
382 | 549,DM,Dipodomys merriami,1,9,1978,7,11,,44,,,,,,M
383 | 550,DM,Dipodomys merriami,1,9,1978,7,14,,46,,,,,,F
384 | 556,DM,Dipodomys merriami,1,9,1978,7,17,,62,,,,,,F
385 | 557,DM,Dipodomys merriami,1,9,1978,7,11,,67,,,,,,F
386 | 559,DM,Dipodomys merriami,1,9,1978,7,14,,72,,,,,,M
387 | 566,DM,Dipodomys merriami,1,10,1978,7,18,,22,,,,,,F
388 | 567,DM,Dipodomys merriami,1,10,1978,7,12,,23,,,,,,F
389 | 571,DM,Dipodomys merriami,1,10,1978,7,18,,27,,,,,,F
390 | 572,DM,Dipodomys merriami,1,10,1978,7,18,,33,,,,,,M
391 | 574,DM,Dipodomys merriami,1,10,1978,7,18,,37,,,,,,F
392 | 575,DM,Dipodomys merriami,1,10,1978,7,18,,41,,,,,,M
393 | 576,DM,Dipodomys merriami,1,10,1978,7,18,,44,,,,,,M
394 | 578,DM,Dipodomys merriami,1,10,1978,7,18,,46,,,,,,M
395 | 579,DM,Dipodomys merriami,1,10,1978,7,5,,55,,,,,,F
396 | 580,DM,Dipodomys merriami,1,10,1978,7,12,,67,,,,,,M
397 | 586,DM,Dipodomys merriami,2,18,1978,8,13,,15,,,,,,M
398 | 589,DM,Dipodomys merriami,2,18,1978,8,20,,17,,,,,,F
399 | 591,DM,Dipodomys merriami,2,18,1978,8,6,,31,,,,,,F
400 | 592,DM,Dipodomys merriami,2,18,1978,8,22,,31,,,,,,M
401 | 593,DM,Dipodomys merriami,2,18,1978,8,2,,46,,,,,,M
402 | 594,DM,Dipodomys merriami,2,18,1978,8,9,,52,,,,,,M
403 | 595,DM,Dipodomys merriami,2,18,1978,8,2,,53,,,,,,M
404 | 597,DM,Dipodomys merriami,2,18,1978,8,20,,53,,,,,,F
405 | 600,DM,Dipodomys merriami,2,18,1978,8,2,,56,,,,,,F
406 | 601,DM,Dipodomys merriami,2,18,1978,8,2,,63,,,,,,M
407 | 602,DM,Dipodomys merriami,2,18,1978,8,13,,63,,,,,,M
408 | 607,DM,Dipodomys merriami,2,19,1978,8,5,,12,,,,,,F
409 | 608,DM,Dipodomys merriami,2,19,1978,8,17,,16,,,,,,F
410 | 610,DM,Dipodomys merriami,2,19,1978,8,17,,21,,,,,,M
411 | 616,DM,Dipodomys merriami,2,19,1978,8,11,,43,,,,,,M
412 | 617,DM,Dipodomys merriami,2,19,1978,8,11,,44,,,,,,M
413 | 619,DM,Dipodomys merriami,2,19,1978,8,14,,46,,,,,,F
414 | 624,DM,Dipodomys merriami,2,19,1978,8,4,,61,,,,,,M
415 | 625,DM,Dipodomys merriami,2,19,1978,8,5,,62,,,,,,F
416 | 627,DM,Dipodomys merriami,2,19,1978,8,17,,63,,,,,,
417 | 628,DM,Dipodomys merriami,2,19,1978,8,11,,65,,,,,,
418 | 635,DM,Dipodomys merriami,2,20,1978,8,15,,24,,,,,,M
419 | 636,DM,Dipodomys merriami,2,20,1978,8,18,,24,,,,,,F
420 | 637,DM,Dipodomys merriami,2,20,1978,8,18,,27,,,,,,F
421 | 638,DM,Dipodomys merriami,2,20,1978,8,12,,34,,,,,,F
422 | 639,DM,Dipodomys merriami,2,20,1978,8,1,,37,,,,,,F
423 | 641,DM,Dipodomys merriami,2,20,1978,8,15,,42,,,,,,M
424 | 642,DM,Dipodomys merriami,2,20,1978,8,1,,44,,,,,,M
425 | 643,DM,Dipodomys merriami,2,20,1978,8,15,,44,,,,,,F
426 | 644,DM,Dipodomys merriami,2,20,1978,8,18,,44,,,,,,M
427 | 645,DM,Dipodomys merriami,2,20,1978,8,12,,56,,,,,,M
428 | 648,DM,Dipodomys merriami,2,20,1978,8,16,1,-99,,,,,,F
429 | 649,DM,Dipodomys merriami,2,20,1978,8,16,1,-99,,,,,,M
430 | 651,DM,Dipodomys merriami,3,11,1978,9,20,,11,,,,,,M
431 | 654,DM,Dipodomys merriami,3,11,1978,9,22,,21,,,,,,F
432 | 660,DM,Dipodomys merriami,3,11,1978,9,2,,35,,,,,,M
433 | 664,DM,Dipodomys merriami,3,11,1978,9,2,,63,,,,,,M
434 | 665,DM,Dipodomys merriami,3,11,1978,9,20,,64,,,,,,F
435 | 667,DM,Dipodomys merriami,3,11,1978,9,20,,67,,,,,,F
436 | 680,DM,Dipodomys merriami,3,12,1978,9,17,,21,,,,,,M
437 | 684,DM,Dipodomys merriami,3,12,1978,9,4,,32,,,,,,M
438 | 690,DM,Dipodomys merriami,3,12,1978,9,11,,44,,,,,,M
439 | 692,DM,Dipodomys merriami,3,12,1978,9,14,,45,,,,,,
440 | 694,DM,Dipodomys merriami,3,12,1978,9,11,,46,,,,,,F
441 | 696,DM,Dipodomys merriami,3,12,1978,9,5,,52,,,,,,F
442 | 697,DM,Dipodomys merriami,3,12,1978,9,11,,54,,,,,,M
443 | 698,DM,Dipodomys merriami,3,12,1978,9,14,,54,,,,,,F
444 | 699,DM,Dipodomys merriami,3,12,1978,9,5,,55,,,,,,F
445 | 700,DM,Dipodomys merriami,3,12,1978,9,5,,56,,,,,,M
446 | 702,DM,Dipodomys merriami,3,12,1978,9,5,,61,,,,,,M
447 | 704,DM,Dipodomys merriami,3,12,1978,9,5,,67,,,,,,M
448 | 707,DM,Dipodomys merriami,3,12,1978,9,17,,74,,,,,,F
449 | 711,DM,Dipodomys merriami,3,13,1978,9,18,,12,,,,,,F
450 | 712,DM,Dipodomys merriami,3,13,1978,9,15,,21,,,,,,M
451 | 714,DM,Dipodomys merriami,3,13,1978,9,15,,26,,,,,,F
452 | 715,DM,Dipodomys merriami,3,13,1978,9,18,,26,,,,,,M
453 | 716,DM,Dipodomys merriami,3,13,1978,9,15,,27,,,,,,M
454 | 717,DM,Dipodomys merriami,3,13,1978,9,1,,32,,,,,,F
455 | 719,DM,Dipodomys merriami,3,13,1978,9,18,,41,,,,,,M
456 | 721,DM,Dipodomys merriami,3,13,1978,9,1,,56,,,,,,F
457 | 724,DM,Dipodomys merriami,3,13,1978,9,15,,63,,,,,,M
458 | 726,DM,Dipodomys merriami,3,13,1978,9,18,,66,,,,,,F
459 | 729,DM,Dipodomys merriami,3,13,1978,9,15,1,-99,,,,,,M
460 | 733,DM,Dipodomys merriami,4,8,1978,-10,2,9,-99,,,,,,M
461 | 734,DM,Dipodomys merriami,4,8,1978,-10,6,9,-99,,,,,,M
462 | 737,DM,Dipodomys merriami,4,8,1978,-10,9,9,-99,,,,,,F
463 | 743,DM,Dipodomys merriami,4,8,1978,-10,20,9,-99,,,,,,M
464 | 745,DM,Dipodomys merriami,4,8,1978,-10,22,9,-99,,,,,,F
465 | 1103,DS,Dipodomys spectabilis,7,8,1978,13,1,,67,,,,,,F
466 | 1105,DS,Dipodomys spectabilis,7,8,1978,13,4,,72,,,,,,F
467 | 1106,DS,Dipodomys spectabilis,7,8,1978,13,4,,73,,,,,,M
468 | 1107,DS,Dipodomys spectabilis,8,4,1978,14,12,,12,,,,,,F
469 | 1111,DS,Dipodomys spectabilis,8,4,1978,14,8,,15,,,,,,F
470 | 1115,DS,Dipodomys spectabilis,8,4,1978,14,12,,21,,,,,,F
471 | 1118,DS,Dipodomys spectabilis,8,4,1978,14,17,,24,,,,,,F
472 | 1122,DS,Dipodomys spectabilis,8,4,1978,14,11,,31,,,,,,M
473 | 1128,DS,Dipodomys spectabilis,8,4,1978,14,22,,42,,,,,,F
474 | 1130,DS,Dipodomys spectabilis,8,4,1978,14,17,,51,,,,,,M
475 | 1133,DS,Dipodomys spectabilis,8,4,1978,14,12,,55,,,,,,M
476 | 1141,DS,Dipodomys spectabilis,8,4,1978,14,9,,71,,,,,,F
477 | 1143,DS,Dipodomys spectabilis,8,4,1978,14,11,,76,,,,,,F
478 | 1151,DS,Dipodomys spectabilis,8,5,1978,14,2,,14,,,,,,M
479 | 1153,DS,Dipodomys spectabilis,8,5,1978,14,18,,14,,,,,,M
480 | 1155,DS,Dipodomys spectabilis,8,5,1978,14,6,,15,,,,,,F
481 | 1156,DS,Dipodomys spectabilis,8,5,1978,14,18,,16,,,,,,M
482 | 1158,DS,Dipodomys spectabilis,8,5,1978,14,5,,17,,,,,,F
483 | 1160,DS,Dipodomys spectabilis,8,5,1978,14,14,,25,,,,,,F
484 | 1162,DS,Dipodomys spectabilis,8,5,1978,14,5,,34,,,,,,M
485 | 1163,DS,Dipodomys spectabilis,8,5,1978,14,18,,35,,,,,,F
486 | 1165,DS,Dipodomys spectabilis,8,5,1978,14,13,,41,,,,,,F
487 | 1166,DS,Dipodomys spectabilis,8,5,1978,14,4,,42,,,,,,M
488 | 1169,DS,Dipodomys spectabilis,8,5,1978,14,1,,44,,,,,,M
489 | 1171,DS,Dipodomys spectabilis,8,5,1978,14,1,,46,,,,,,
490 | 1172,DS,Dipodomys spectabilis,8,5,1978,14,6,,52,,,,,,F
491 | 1180,DS,Dipodomys spectabilis,8,5,1978,14,4,,61,,,,,,F
492 | 1182,DS,Dipodomys spectabilis,8,5,1978,14,1,,64,,,,,,F
493 | 1185,DS,Dipodomys spectabilis,8,5,1978,14,1,,66,,,,,,F
494 | 1186,DS,Dipodomys spectabilis,8,5,1978,14,4,,66,,,,,,F
495 | 1188,DS,Dipodomys spectabilis,8,5,1978,14,1,,67,,,,,,M
496 | 1189,DS,Dipodomys spectabilis,8,5,1978,14,4,,71,,,,,,F
497 | 1191,DS,Dipodomys spectabilis,8,5,1978,14,5,,76,,,,,,F
498 | 1199,DS,Dipodomys spectabilis,9,3,1978,15,12,,21,,,,,,M
499 | 1200,DS,Dipodomys spectabilis,9,3,1978,15,11,,22,,,,,,M
500 | 1205,DS,Dipodomys spectabilis,9,3,1978,15,8,,25,,,,,,F
501 | 1209,DS,Dipodomys spectabilis,9,3,1978,15,12,,31,,,,,,F
502 | 1211,DS,Dipodomys spectabilis,9,3,1978,15,9,,32,,,,,,F
503 | 1212,DS,Dipodomys spectabilis,9,3,1978,15,17,,32,,,,,,F
504 | 1213,DS,Dipodomys spectabilis,9,3,1978,15,22,,32,,,,,,F
505 | 1223,DS,Dipodomys spectabilis,9,3,1978,15,22,,45,,,,,,F
506 | 1224,DS,Dipodomys spectabilis,9,3,1978,15,17,,52,,,,,,M
507 | 1225,DS,Dipodomys spectabilis,9,3,1978,15,9,,53,,,,,,F
508 | 1231,DS,Dipodomys spectabilis,9,3,1978,15,20,,56,,,,,,M
509 | 1234,DS,Dipodomys spectabilis,9,3,1978,15,8,,63,,,,,,F
510 | 1238,DS,Dipodomys spectabilis,9,3,1978,15,22,,67,,,,,,F
511 | 1239,DS,Dipodomys spectabilis,9,3,1978,15,12,,71,,,,,,F
512 | 1243,DS,Dipodomys spectabilis,9,3,1978,15,9,,73,,,,,,F
513 | 1244,DS,Dipodomys spectabilis,9,3,1978,15,11,,73,,,,,,F
514 | 1254,DS,Dipodomys spectabilis,9,4,1978,15,18,,16,,,,,,M
515 | 1260,DS,Dipodomys spectabilis,9,4,1978,15,18,,25,,,,,,F
516 | 1263,DS,Dipodomys spectabilis,9,4,1978,15,13,,27,,,,,,F
517 | 1266,DS,Dipodomys spectabilis,9,4,1978,15,2,,34,,,,,,M
518 | 1267,DS,Dipodomys spectabilis,9,4,1978,15,4,,35,,,,,,M
519 | 1268,DS,Dipodomys spectabilis,9,4,1978,15,1,,37,,,,,,F
520 | 1271,DS,Dipodomys spectabilis,9,4,1978,15,1,,43,,,,,,M
521 | 1273,DS,Dipodomys spectabilis,9,4,1978,15,14,,44,,,,,,F
522 | 1274,DS,Dipodomys spectabilis,9,4,1978,15,6,,46,,,,,,F
523 | 1278,DS,Dipodomys spectabilis,9,4,1978,15,6,,51,,,,,,F
524 | 1280,DS,Dipodomys spectabilis,9,4,1978,15,5,,54,,,,,,M
525 | 1287,DS,Dipodomys spectabilis,9,4,1978,15,13,,61,,,,,,F
526 | 1292,DS,Dipodomys spectabilis,9,4,1978,15,4,,67,,,,,,F
527 | 1293,DS,Dipodomys spectabilis,9,4,1978,15,5,,67,,,,,,F
528 | 1296,DS,Dipodomys spectabilis,9,4,1978,15,1,,73,,,,,,F
529 | 1297,DS,Dipodomys spectabilis,9,4,1978,15,4,,73,,,,,,F
530 | 1298,DS,Dipodomys spectabilis,9,4,1978,15,5,,73,,,,,,F
531 | 1305,DS,Dipodomys spectabilis,10,6,1978,16,1,,36,,,,,,F
532 | 1307,DS,Dipodomys spectabilis,10,6,1978,16,1,,43,,,,,,M
533 | 1308,DS,Dipodomys spectabilis,10,6,1978,16,1,,74,,,,,,F
534 | 1314,DS,Dipodomys spectabilis,10,7,1978,16,8,,15,,,,,,F
535 | 1315,DS,Dipodomys spectabilis,10,7,1978,16,11,,15,,,,,,M
536 | 1323,DS,Dipodomys spectabilis,10,7,1978,16,22,,31,,,,,,F
537 | 1325,DS,Dipodomys spectabilis,10,7,1978,16,9,,33,,,,,,F
538 | 1326,DS,Dipodomys spectabilis,10,7,1978,16,20,,34,,,,,,M
539 | 1330,DS,Dipodomys spectabilis,10,7,1978,16,17,,41,,,,,,M
540 | 1331,DS,Dipodomys spectabilis,10,7,1978,16,9,,46,,,,,,M
541 | 1333,DS,Dipodomys spectabilis,10,7,1978,16,17,,53,,,,,,F
542 | 1334,DS,Dipodomys spectabilis,10,7,1978,16,12,,54,,,,,,F
543 | 1335,DS,Dipodomys spectabilis,10,7,1978,16,9,,55,,,,,,F
544 | 1336,DS,Dipodomys spectabilis,10,7,1978,16,22,,56,,,,,,F
545 | 1338,DS,Dipodomys spectabilis,10,7,1978,16,8,,63,,,,,,F
546 | 1340,DS,Dipodomys spectabilis,10,7,1978,16,11,,66,,,,,,F
547 | 1342,DS,Dipodomys spectabilis,10,7,1978,16,9,,72,,,,,,F
548 | 1358,DS,Dipodomys spectabilis,10,8,1978,16,5,,17,,,,,,M
549 | 1360,DS,Dipodomys spectabilis,10,8,1978,16,18,,17,,,,,,M
550 | 1363,DS,Dipodomys spectabilis,10,8,1978,16,18,,33,,,,,,M
551 | 1364,DS,Dipodomys spectabilis,10,8,1978,16,14,,34,,,,,,F
552 | 1365,DS,Dipodomys spectabilis,10,8,1978,16,2,,35,,,,,,M
553 | 1367,DS,Dipodomys spectabilis,10,8,1978,16,6,,37,,,,,,F
554 | 1371,DS,Dipodomys spectabilis,10,8,1978,16,4,,44,,,,,,M
555 | 1373,DS,Dipodomys spectabilis,10,8,1978,16,18,,44,,,,,,F
556 | 1376,DS,Dipodomys spectabilis,10,8,1978,16,6,,52,,,,,,F
557 | 1384,DS,Dipodomys spectabilis,10,8,1978,16,13,,64,,,,,,F
558 | 1387,DS,Dipodomys spectabilis,10,8,1978,16,4,,71,,,,,,F
559 | 1398,DS,Dipodomys spectabilis,11,4,1978,17,17,,11,,,,,,F
560 | 1399,DS,Dipodomys spectabilis,11,4,1978,17,12,,12,,,,,,F
561 | 1401,DS,Dipodomys spectabilis,11,4,1978,17,8,,16,,,,,,F
562 | 1403,DS,Dipodomys spectabilis,11,4,1978,17,1,,23,,,,,,M
563 | 1404,DS,Dipodomys spectabilis,11,4,1978,17,1,,25,,,,,,F
564 | 1411,DS,Dipodomys spectabilis,11,4,1978,17,9,,43,,,,,,F
565 | 1412,DS,Dipodomys spectabilis,11,4,1978,17,9,,46,,,,,,M
566 | 1414,DS,Dipodomys spectabilis,11,4,1978,17,17,,52,,,,,,M
567 | 1422,DS,Dipodomys spectabilis,11,4,1978,17,1,,64,,,,,,M
568 | 1423,DS,Dipodomys spectabilis,11,4,1978,17,9,,64,,,,,,F
569 | 1425,DS,Dipodomys spectabilis,11,4,1978,17,22,,65,,,,,,F
570 | 1429,DS,Dipodomys spectabilis,11,4,1978,17,20,,72,,,,,,M
571 | 1431,DS,Dipodomys spectabilis,11,4,1978,17,9,,74,,,,,,F
572 | 1447,DS,Dipodomys spectabilis,11,5,1978,17,6,,25,,,,,,F
573 | 1449,DS,Dipodomys spectabilis,11,5,1978,17,5,,33,,,,,,M
574 | 1450,DS,Dipodomys spectabilis,11,5,1978,17,13,,33,,,,,,F
575 | 1451,DS,Dipodomys spectabilis,11,5,1978,17,18,,34,,,,,,M
576 | 1452,DS,Dipodomys spectabilis,11,5,1978,17,18,,35,,,,,,F
577 | 1454,DS,Dipodomys spectabilis,11,5,1978,17,4,,37,,,,,,M
578 | 1459,DS,Dipodomys spectabilis,11,5,1978,17,6,,52,,,,,,F
579 | 1463,DS,Dipodomys spectabilis,11,5,1978,17,14,,63,,,,,,F
580 | 1484,DS,Dipodomys spectabilis,12,2,1978,18,9,,16,,,,,,F
581 | 1488,DS,Dipodomys spectabilis,12,2,1978,18,17,,23,,,,,,F
582 | 1497,DS,Dipodomys spectabilis,12,2,1978,18,20,,35,,,,,,M
583 | 1499,DS,Dipodomys spectabilis,12,2,1978,18,9,,45,,,,,,F
584 | 1501,DS,Dipodomys spectabilis,12,2,1978,18,8,,53,,,,,,F
585 | 1502,DS,Dipodomys spectabilis,12,2,1978,18,9,,53,,,,,,F
586 | 1503,DS,Dipodomys spectabilis,12,2,1978,18,22,,53,,,,,,F
587 | 1504,DS,Dipodomys spectabilis,12,2,1978,18,12,,55,,,,,,F
588 | 1509,DS,Dipodomys spectabilis,12,2,1978,18,22,,66,,,,,,F
589 | 1520,DS,Dipodomys spectabilis,12,3,1978,18,14,,14,,,,,,F
590 | 1521,DS,Dipodomys spectabilis,12,3,1978,18,6,,15,,,,,,F
591 | 1525,DS,Dipodomys spectabilis,12,3,1978,18,18,,41,,,,,,M
592 | 1526,DS,Dipodomys spectabilis,12,3,1978,18,18,,46,,,,,,F
593 | 1527,DS,Dipodomys spectabilis,12,3,1978,18,6,,52,,,,,,F
594 | 1531,DS,Dipodomys spectabilis,12,3,1978,18,4,,57,,,,,,M
595 | 1537,DS,Dipodomys spectabilis,12,3,1978,18,5,,65,,,,,,M
596 | 1540,DS,Dipodomys spectabilis,12,3,1978,18,13,,66,,,,,,F
597 | 1553,DS,Dipodomys spectabilis,1,28,1979,19,8,,14,,,,,,F
598 | 1582,DS,Dipodomys spectabilis,1,29,1979,19,6,,33,,,,,,F
599 | 1588,DS,Dipodomys spectabilis,1,29,1979,19,18,,44,,,,,,M
600 | 1589,DS,Dipodomys spectabilis,1,29,1979,19,4,,45,,,,,,M
601 | 1592,DS,Dipodomys spectabilis,1,29,1979,19,18,,55,,,,,,F
602 | 1601,DS,Dipodomys spectabilis,1,29,1979,19,14,,65,,,,,,F
603 | 1625,DS,Dipodomys spectabilis,2,24,1979,20,12,,35,,,,,,F
604 | 1627,DS,Dipodomys spectabilis,2,24,1979,20,8,,37,,,,,,M
605 | 1630,DS,Dipodomys spectabilis,2,24,1979,20,8,,53,,,,,,F
606 | 1631,DS,Dipodomys spectabilis,2,24,1979,20,22,,53,,,,,,F
607 | 1633,DS,Dipodomys spectabilis,2,24,1979,20,17,,55,,,,,,F
608 | 1637,DS,Dipodomys spectabilis,2,24,1979,20,9,,73,,,,,,F
609 | 1638,DS,Dipodomys spectabilis,2,24,1979,20,20,,77,,,,,,F
610 | 1647,DS,Dipodomys spectabilis,2,25,1979,20,5,,26,,,,,,M
611 | 1649,DS,Dipodomys spectabilis,2,25,1979,20,18,,31,,,,,,M
612 | 1652,DS,Dipodomys spectabilis,2,25,1979,20,18,,43,,,,,,F
613 | 1655,DS,Dipodomys spectabilis,2,25,1979,20,6,,52,,,,,,F
614 | 1656,DS,Dipodomys spectabilis,2,25,1979,20,1,,53,,,,,,M
615 | 1658,DS,Dipodomys spectabilis,2,25,1979,20,4,,57,,,,,,M
616 | 1659,DS,Dipodomys spectabilis,2,25,1979,20,13,,61,,,,,,M
617 | 1660,DS,Dipodomys spectabilis,2,25,1979,20,14,,62,,,,,,F
618 | 1671,DS,Dipodomys spectabilis,3,31,1979,21,12,,12,,,,,,M
619 | 1673,DS,Dipodomys spectabilis,3,31,1979,21,2,,15,,,,,,F
620 | 1678,DS,Dipodomys spectabilis,3,31,1979,21,14,,22,,,,,,F
621 | 1680,DS,Dipodomys spectabilis,3,31,1979,21,14,,24,,,,,,F
622 | 1681,DS,Dipodomys spectabilis,3,31,1979,21,5,,26,,,,,,M
623 | 1683,DS,Dipodomys spectabilis,3,31,1979,21,17,,31,,,,,,M
624 | 1684,DS,Dipodomys spectabilis,3,31,1979,21,12,,32,,,,,,F
625 | 1685,DS,Dipodomys spectabilis,3,31,1979,21,14,,33,,,,,,F
626 | 1689,DS,Dipodomys spectabilis,3,31,1979,21,18,,42,,,,,,M
627 | 1690,DS,Dipodomys spectabilis,3,31,1979,21,18,,45,,,,,,M
628 | 1693,DS,Dipodomys spectabilis,3,31,1979,21,22,,52,,,,,,F
629 | 1694,DS,Dipodomys spectabilis,3,31,1979,21,8,,53,,,,,,F
630 | 1695,DS,Dipodomys spectabilis,3,31,1979,21,1,,54,,,,,,M
631 | 1696,DS,Dipodomys spectabilis,3,31,1979,21,9,,54,,,,,,F
632 | 1697,DS,Dipodomys spectabilis,3,31,1979,21,1,,56,,,,,,M
633 | 1698,DS,Dipodomys spectabilis,3,31,1979,21,18,,56,,,,,,M
634 | 1703,DS,Dipodomys spectabilis,3,31,1979,21,17,,63,,,,,,F
635 | 1704,DS,Dipodomys spectabilis,3,31,1979,21,9,,64,,,,,,F
636 | 1705,DS,Dipodomys spectabilis,3,31,1979,21,9,,66,,,,,,F
637 | 1708,DS,Dipodomys spectabilis,3,31,1979,21,13,,71,,,,,,F
638 | 1710,DS,Dipodomys spectabilis,3,31,1979,21,11,,74,,,,,,M
639 | 1713,DS,Dipodomys spectabilis,3,31,1979,21,13,,76,,,,,,F
640 | 1714,DS,Dipodomys spectabilis,3,31,1979,21,4,,77,,,,,,M
641 | 1726,DS,Dipodomys spectabilis,4,28,1979,22,12,,12,,,,,,M
642 | 1727,DS,Dipodomys spectabilis,4,28,1979,22,12,,13,,,,,,F
643 | 1728,DS,Dipodomys spectabilis,4,28,1979,22,12,,14,,,,,,F
644 | 1732,DS,Dipodomys spectabilis,4,28,1979,22,22,,41,,,,,,F
645 | 1733,DS,Dipodomys spectabilis,4,28,1979,22,1,,42,,,,,,M
646 | 1735,DS,Dipodomys spectabilis,4,28,1979,22,1,,46,,,,,,F
647 | 1736,DS,Dipodomys spectabilis,4,28,1979,22,22,,46,,,,,,M
648 | 1737,DS,Dipodomys spectabilis,4,28,1979,22,9,,47,,,,,,F
649 | 1738,DS,Dipodomys spectabilis,4,28,1979,22,8,,52,,,,,,F
650 | 1739,DS,Dipodomys spectabilis,4,28,1979,22,17,,52,,,,,,M
651 | 1740,DS,Dipodomys spectabilis,4,28,1979,22,9,,54,,,,,,M
652 | 1741,DS,Dipodomys spectabilis,4,28,1979,22,9,,56,,,,,,F
653 | 1742,DS,Dipodomys spectabilis,4,28,1979,22,9,,57,,,,,,F
654 | 1744,DS,Dipodomys spectabilis,4,28,1979,22,20,,62,,,,,,M
655 | 1745,DS,Dipodomys spectabilis,4,28,1979,22,17,,63,,,,,,F
656 | 1747,DS,Dipodomys spectabilis,4,28,1979,22,20,,67,,,,,,F
657 | 1748,DS,Dipodomys spectabilis,4,28,1979,22,9,,71,,,,,,M
658 | 1749,DS,Dipodomys spectabilis,4,28,1979,22,9,,74,,,,,,F
659 | 1759,DS,Dipodomys spectabilis,4,29,1979,22,14,,33,,,,,,M
660 | 1761,DS,Dipodomys spectabilis,4,29,1979,22,5,,37,,,,,,M
661 | 1764,DS,Dipodomys spectabilis,4,29,1979,22,13,,41,,,,,,M
662 | 1766,DS,Dipodomys spectabilis,4,29,1979,22,14,,43,,,,,,M
663 | 1770,DS,Dipodomys spectabilis,4,29,1979,22,18,,54,,,,,,M
664 | 1772,DS,Dipodomys spectabilis,4,29,1979,22,13,,61,,,,,,F
665 | 1773,DS,Dipodomys spectabilis,4,29,1979,22,4,,71,,,,,,F
666 | 1774,DS,Dipodomys spectabilis,4,29,1979,22,5,,73,,,,,,M
667 | 1781,DS,Dipodomys spectabilis,5,29,1979,23,9,,12,,,,,,F
668 | 1783,DS,Dipodomys spectabilis,5,29,1979,23,12,,21,,,,,,M
669 | 1786,DS,Dipodomys spectabilis,5,29,1979,23,22,,26,,,,,,M
670 | 1787,DS,Dipodomys spectabilis,5,29,1979,23,17,,31,,,,,,F
671 | 1791,DS,Dipodomys spectabilis,5,29,1979,23,17,,34,,,,,,M
672 | 1792,DS,Dipodomys spectabilis,5,29,1979,23,9,,36,,,,,,F
673 | 1793,DS,Dipodomys spectabilis,5,29,1979,23,22,,37,,,,,,M
674 | 1794,DS,Dipodomys spectabilis,5,29,1979,23,9,,43,,,,,,F
675 | 1795,DS,Dipodomys spectabilis,5,29,1979,23,17,,43,,,,,,F
676 | 1797,DS,Dipodomys spectabilis,5,29,1979,23,9,,46,,,,,,F
677 | 1799,DS,Dipodomys spectabilis,5,29,1979,23,17,,51,,,,,,M
678 | 1800,DS,Dipodomys spectabilis,5,29,1979,23,9,,53,,,,,,F
679 | 1801,DS,Dipodomys spectabilis,5,29,1979,23,17,,53,,,,,,
680 | 1802,DS,Dipodomys spectabilis,5,29,1979,23,22,,53,,,,,,F
681 | 1803,DS,Dipodomys spectabilis,5,29,1979,23,9,,54,,,,,,M
682 | 1804,DS,Dipodomys spectabilis,5,29,1979,23,20,,55,,,,,,M
683 | 1806,DS,Dipodomys spectabilis,5,29,1979,23,8,,61,,,,,,F
684 | 1810,DS,Dipodomys spectabilis,5,29,1979,23,22,,67,,,,,,F
685 | 1812,DS,Dipodomys spectabilis,5,29,1979,23,20,,75,,,,,,M
686 | 1814,DS,Dipodomys spectabilis,5,29,1979,23,20,,77,,,,,,F
687 | 1821,DS,Dipodomys spectabilis,5,30,1979,23,18,,25,,,,,,F
688 | 1824,DS,Dipodomys spectabilis,5,30,1979,23,5,,35,,,,,,F
689 | 1827,DS,Dipodomys spectabilis,5,30,1979,23,14,,43,,,,,,
690 | 1828,DS,Dipodomys spectabilis,5,30,1979,23,18,,43,,,,,,M
691 | 1829,DS,Dipodomys spectabilis,5,30,1979,23,1,,47,,,,,,F
692 | 1832,DS,Dipodomys spectabilis,5,30,1979,23,13,,53,,,,,,F
693 | 1835,DS,Dipodomys spectabilis,5,30,1979,23,5,,61,,,,,,M
694 | 1836,DS,Dipodomys spectabilis,5,30,1979,23,1,,62,,,,,,M
695 | 1837,DS,Dipodomys spectabilis,5,30,1979,23,4,,62,,,,,,F
696 | 1838,DS,Dipodomys spectabilis,5,30,1979,23,14,,62,,,,,,F
697 | 1840,DS,Dipodomys spectabilis,5,30,1979,23,1,,66,,,,,,M
698 | 1841,DS,Dipodomys spectabilis,5,30,1979,23,14,,66,,,,,,M
699 | 1853,DS,Dipodomys spectabilis,7,3,1979,24,12,,11,,,,,,M
700 | 1857,DS,Dipodomys spectabilis,7,3,1979,24,9,,45,,,,,,F
701 | 1859,DS,Dipodomys spectabilis,7,3,1979,24,22,,46,,,,,,M
702 | 1861,DS,Dipodomys spectabilis,7,3,1979,24,9,,51,,,,,,F
703 | 1862,DS,Dipodomys spectabilis,7,3,1979,24,17,,51,,,,,,M
704 | 1864,DS,Dipodomys spectabilis,7,3,1979,24,8,,53,,,,,,F
705 | 35097,OT,Onychomys torridus,11,10,2002,293,11,,24,,,,,,M
706 | 35099,OT,Onychomys torridus,11,10,2002,293,9,,62,,,,,,F
707 | 35123,OT,Onychomys torridus,11,10,2002,293,4,,22,,,,,,M
708 | 35132,OT,Onychomys torridus,11,10,2002,293,9,,11,,,,,,M
709 | 35140,OT,Onychomys torridus,11,10,2002,293,8,,21,,,,,,F
710 | 35146,OT,Onychomys torridus,11,10,2002,293,8,,16,,,,,,M
711 | 35156,OT,Onychomys torridus,11,10,2002,293,13,,45,,,,,,M
712 | 35161,OT,Onychomys torridus,11,10,2002,293,13,,13,,,,,,F
713 | 35163,OT,Onychomys torridus,11,10,2002,293,13,,22,,,,,,M
714 | 35185,OT,Onychomys torridus,11,10,2002,293,16,,62,,,,,,F
715 | 35187,OT,Onychomys torridus,11,10,2002,293,5,,21,,,,,,F
716 | 35190,OT,Onychomys torridus,12,7,2002,294,1,,14,,,,,,M
717 | 35192,OT,Onychomys torridus,12,7,2002,294,1,,21,,,,,,F
718 | 35198,OT,Onychomys torridus,12,7,2002,294,1,,57,,,,,,M
719 | 35204,OT,Onychomys torridus,12,7,2002,294,2,3,29,,,,,,M
720 | 35213,OT,Onychomys torridus,12,7,2002,294,17,,77,,,,,,M
721 | 35269,OT,Onychomys torridus,12,7,2002,294,20,,53,,,,,,M
722 | 35279,OT,Onychomys torridus,12,7,2002,294,16,,45,,,,,,F
723 | 35282,OT,Onychomys torridus,12,7,2002,294,23,,32,,,,,,M
724 | 35305,OT,Onychomys torridus,12,8,2002,294,4,,26,,,,,,M
725 | 35306,OT,Onychomys torridus,12,8,2002,294,4,,17,,,,,,F
726 | 35307,OT,Onychomys torridus,12,8,2002,294,6,,54,,,,,,M
727 | 35320,OT,Onychomys torridus,12,8,2002,294,6,,37,,,,,,F
728 | 35330,OT,Onychomys torridus,12,8,2002,294,11,,45,,,,,,F
729 | 35337,OT,Onychomys torridus,12,8,2002,294,9,,71,,,,,,M
730 | 35342,OT,Onychomys torridus,12,8,2002,294,9,,67,,,,,,F
731 | 35354,OT,Onychomys torridus,12,8,2002,294,8,,21,,,,,,M
732 | 35360,OT,Onychomys torridus,12,8,2002,294,13,,62,,,,,,M
733 | 35384,OT,Onychomys torridus,12,8,2002,294,5,,75,,,,,,F
734 | 35387,OT,Onychomys torridus,12,29,2002,295,1,,51,,,,,,M
735 | 35395,OT,Onychomys torridus,12,29,2002,295,2,,57,,,,,,M
736 | 35449,OT,Onychomys torridus,12,29,2002,295,20,,16,,,,,,F
737 | 35480,OT,Onychomys torridus,12,29,2002,295,16,,37,,,,,,F
738 | 35484,OT,Onychomys torridus,12,29,2002,295,16,,54,,,,,,M
739 | 35495,OT,Onychomys torridus,12,31,2002,295,3,,72,,,,,,F
740 | 35505,OT,Onychomys torridus,12,31,2002,295,6,,57,,,,,,F
741 | 35526,OT,Onychomys torridus,12,31,2002,295,8,,12,,,,,,F
742 | 35530,OT,Onychomys torridus,12,31,2002,295,13,,22,,,,,,F
743 | 70,OX,Onychomys�sp.,8,19,1977,2,3,,57,,,,,,F
744 | 117,OX,Onychomys�sp.,8,21,1977,2,21,,13,,,,,,F
745 | 166,OX,Onychomys�sp.,9,11,1977,3,21,,27,,,,,,M
746 | 177,OX,Onychomys�sp.,9,11,1977,3,5,,63,,,,,,F
747 | 185,OX,Onychomys�sp.,9,11,1977,3,12,,77,,,,,,F
748 | 242,OX,Onychomys�sp.,9,13,1977,3,2,,77,,,,,,M
749 | 333,OX,Onychomys�sp.,10,18,1977,4,19,,22,,,,,,
750 | 587,OX,Onychomys�sp.,2,18,1978,8,2,,16,,,,,,
751 | 6609,OX,Onychomys�sp.,9,19,1982,62,19,,21,,,,,,M
752 | 9209,OX,Onychomys�sp.,5,27,1984,79,14,,33,,,,,,M
753 | 16235,OX,Onychomys�sp.,7,3,1989,136,12,,42,,,,,,M
754 | 20654,OX,Onychomys�sp.,2,19,1993,180,17,,57,,,,,,
755 | 16854,BA,Baiomys taylori,12,5,1989,141,3,,56,,,,,,M
756 | 16951,BA,Baiomys taylori,1,7,1990,142,5,,41,,,,,,F
757 | 17174,BA,Baiomys taylori,2,25,1990,144,5,,13,,,,,,M
758 | 17190,BA,Baiomys taylori,2,25,1990,144,5,,24,,,,,,F
759 | 17374,BA,Baiomys taylori,4,24,1990,146,1,,17,,,,,,M
760 | 17486,BA,Baiomys taylori,4,26,1990,146,3,,77,,,,,,M
761 | 17566,BA,Baiomys taylori,5,25,1990,147,3,,46,,,,,,F
762 | 17616,BA,Baiomys taylori,6,22,1990,148,3,,17,,,,,,F
763 | 17773,BA,Baiomys taylori,8,17,1990,150,3,,12,,,,,,F
764 | 17935,BA,Baiomys taylori,10,16,1990,152,3,,63,,,,,,F
765 | 18085,BA,Baiomys taylori,12,15,1990,154,19,,36,,,,,,F
766 | 18132,BA,Baiomys taylori,12,16,1990,154,3,,22,,,,,,F
767 | 18252,BA,Baiomys taylori,1,12,1991,155,3,,11,,,,,,F
768 | 18323,BA,Baiomys taylori,2,16,1991,156,19,,21,,,,,,F
769 | 18509,BA,Baiomys taylori,3,14,1991,157,3,,24,,,,,,F
770 | 18574,BA,Baiomys taylori,4,19,1991,158,19,,46,,,,,,F
771 | 18604,BA,Baiomys taylori,4,21,1991,158,3,,12,,,,,,F
772 | 18666,BA,Baiomys taylori,5,13,1991,159,19,,45,,,,,,F
773 | 18687,BA,Baiomys taylori,5,14,1991,159,3,,13,,,,,,F
774 | 18768,BA,Baiomys taylori,6,13,1991,160,18,,65,,,,,,F
775 | 18778,BA,Baiomys taylori,6,14,1991,160,3,,21,,,,,,F
776 | 18828,BA,Baiomys taylori,7,12,1991,161,19,,27,,,,,,F
777 | 18855,BA,Baiomys taylori,7,13,1991,161,3,,11,,,,,,F
778 | 18935,BA,Baiomys taylori,8,7,1991,162,18,,37,,,,,,F
779 | 19015,BA,Baiomys taylori,9,9,1991,163,19,,16,,,,,,F
780 | 19109,BA,Baiomys taylori,10,10,1991,164,20,,27,,,,,,F
781 | 19121,BA,Baiomys taylori,10,10,1991,164,2,,46,,,,,,M
782 | 19144,BA,Baiomys taylori,10,11,1991,164,3,1,13,,,,,,
783 | 19220,BA,Baiomys taylori,11,13,1991,165,19,,42,,,,,,F
784 | 19249,BA,Baiomys taylori,11,13,1991,165,19,,76,,,,,,M
785 | 19256,BA,Baiomys taylori,11,14,1991,165,3,,14,,,,,,F
786 | 19260,BA,Baiomys taylori,11,14,1991,165,21,,17,,,,,,M
787 | 19274,BA,Baiomys taylori,11,14,1991,165,3,,34,,,,,,F
788 | 22711,PB,Chaetodipus baileyi,9,23,1995,212,1,,54,,,,,,F
789 | 22868,PB,Chaetodipus baileyi,10,28,1995,213,1,,41,,,,,,F
790 | 15878,CS,Crotalus scutalatus,4,1,1989,133,11,13,47,,,,,,
791 | 13313,CV,Crotalus viridis,8,26,1987,114,15,13,61,,,,,,
792 |
--------------------------------------------------------------------------------
/episodes/fig/DC1_logo_small.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/datacarpentry/OpenRefine-ecology-lesson/0959fa8e59ae22cdfd277854a52ceb236df4e897/episodes/fig/DC1_logo_small.png
--------------------------------------------------------------------------------
/episodes/fig/DataONE_LOGO.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/datacarpentry/OpenRefine-ecology-lesson/0959fa8e59ae22cdfd277854a52ceb236df4e897/episodes/fig/DataONE_LOGO.jpg
--------------------------------------------------------------------------------
/episodes/fig/creative-commons-attribution-license.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/datacarpentry/OpenRefine-ecology-lesson/0959fa8e59ae22cdfd277854a52ceb236df4e897/episodes/fig/creative-commons-attribution-license.png
--------------------------------------------------------------------------------
/episodes/fig/or362-clustering-result.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/datacarpentry/OpenRefine-ecology-lesson/0959fa8e59ae22cdfd277854a52ceb236df4e897/episodes/fig/or362-clustering-result.png
--------------------------------------------------------------------------------
/episodes/fig/or362-clustering.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/datacarpentry/OpenRefine-ecology-lesson/0959fa8e59ae22cdfd277854a52ceb236df4e897/episodes/fig/or362-clustering.png
--------------------------------------------------------------------------------
/episodes/fig/or362-data-from-url.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/datacarpentry/OpenRefine-ecology-lesson/0959fa8e59ae22cdfd277854a52ceb236df4e897/episodes/fig/or362-data-from-url.png
--------------------------------------------------------------------------------
/episodes/fig/or362-facet-menu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/datacarpentry/OpenRefine-ecology-lesson/0959fa8e59ae22cdfd277854a52ceb236df4e897/episodes/fig/or362-facet-menu.png
--------------------------------------------------------------------------------
/episodes/fig/or362-faceted-scientificname.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/datacarpentry/OpenRefine-ecology-lesson/0959fa8e59ae22cdfd277854a52ceb236df4e897/episodes/fig/or362-faceted-scientificname.png
--------------------------------------------------------------------------------
/episodes/fig/or362-filter-scientificname.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/datacarpentry/OpenRefine-ecology-lesson/0959fa8e59ae22cdfd277854a52ceb236df4e897/episodes/fig/or362-filter-scientificname.png
--------------------------------------------------------------------------------
/episodes/fig/or362-parse-json.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/datacarpentry/OpenRefine-ecology-lesson/0959fa8e59ae22cdfd277854a52ceb236df4e897/episodes/fig/or362-parse-json.png
--------------------------------------------------------------------------------
/episodes/fig/or362-plotid-tonumber.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/datacarpentry/OpenRefine-ecology-lesson/0959fa8e59ae22cdfd277854a52ceb236df4e897/episodes/fig/or362-plotid-tonumber.png
--------------------------------------------------------------------------------
/episodes/fig/or362-reconcile-add.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/datacarpentry/OpenRefine-ecology-lesson/0959fa8e59ae22cdfd277854a52ceb236df4e897/episodes/fig/or362-reconcile-add.png
--------------------------------------------------------------------------------
/episodes/fig/or362-reconcile-id.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/datacarpentry/OpenRefine-ecology-lesson/0959fa8e59ae22cdfd277854a52ceb236df4e897/episodes/fig/or362-reconcile-id.png
--------------------------------------------------------------------------------
/episodes/fig/or362-reconcile.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/datacarpentry/OpenRefine-ecology-lesson/0959fa8e59ae22cdfd277854a52ceb236df4e897/episodes/fig/or362-reconcile.png
--------------------------------------------------------------------------------
/episodes/fig/or362-undoredo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/datacarpentry/OpenRefine-ecology-lesson/0959fa8e59ae22cdfd277854a52ceb236df4e897/episodes/fig/or362-undoredo.png
--------------------------------------------------------------------------------
/episodes/fig/or372-create-project.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/datacarpentry/OpenRefine-ecology-lesson/0959fa8e59ae22cdfd277854a52ceb236df4e897/episodes/fig/or372-create-project.png
--------------------------------------------------------------------------------
/episodes/fig/or372-data-import.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/datacarpentry/OpenRefine-ecology-lesson/0959fa8e59ae22cdfd277854a52ceb236df4e897/episodes/fig/or372-data-import.png
--------------------------------------------------------------------------------
/episodes/fig/or372-fetch-gbifjson.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/datacarpentry/OpenRefine-ecology-lesson/0959fa8e59ae22cdfd277854a52ceb236df4e897/episodes/fig/or372-fetch-gbifjson.png
--------------------------------------------------------------------------------
/episodes/fig/or372-joincols.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/datacarpentry/OpenRefine-ecology-lesson/0959fa8e59ae22cdfd277854a52ceb236df4e897/episodes/fig/or372-joincols.png
--------------------------------------------------------------------------------
/episodes/fig/or372-reconcile-results.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/datacarpentry/OpenRefine-ecology-lesson/0959fa8e59ae22cdfd277854a52ceb236df4e897/episodes/fig/or372-reconcile-results.png
--------------------------------------------------------------------------------
/episodes/fig/or372-scatterplots.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/datacarpentry/OpenRefine-ecology-lesson/0959fa8e59ae22cdfd277854a52ceb236df4e897/episodes/fig/or372-scatterplots.png
--------------------------------------------------------------------------------
/index.md:
--------------------------------------------------------------------------------
1 | ---
2 | site: sandpaper::sandpaper_site
3 | ---
4 |
5 | Before you can analyze data you need to clean it. Data cleaning identifies errors and corrects formatting to create consistent data. This step must be taken with extreme care and attention because without clean data the results of analysis may be false and non-reproducible.
6 |
7 | OpenRefine is a powerful free and open source tool for working with messy data: cleaning it and transforming it from one format into another.
8 |
9 | This lesson will teach you to use OpenRefine to clean and format
10 | data effectively and automatically track any changes that you make. Many people comment
11 | that this tool saves them literally months of work trying to make these
12 | edits by hand.
13 |
14 | :::::::::::::::::::::::::::::::::::::::::: prereq
15 |
16 | ## Getting Started
17 |
18 | Data Carpentry's teaching is hands-on, so participants are encouraged to use
19 | their own computers to ensure the proper setup of tools for an efficient
20 | workflow.
**These lessons assume no prior knowledge of the skills or tools.**
21 |
22 | To get started, follow the directions in the [Setup](learners/setup.md) page to
23 | download data to your computer and follow any installation instructions.
24 |
25 | To most effectively use these materials, please make sure to install
26 | everything *before* working through this lesson.
27 |
28 |
29 | ::::::::::::::::::::::::::::::::::::::::::::::::::
30 |
31 | :::::::::::::::::::::::::::::::::::::::::: prereq
32 |
33 | ## For Instructors
34 |
35 | If you are teaching this lesson in a workshop, please see the
36 | [Instructor notes](instructors/instructor-notes.md).
37 |
38 |
39 | ::::::::::::::::::::::::::::::::::::::::::::::::::
40 |
41 |
42 |
--------------------------------------------------------------------------------
/instructors/instructor-notes.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Instructor Notes
3 | ---
4 |
5 | ## Lesson motivation and learning objectives
6 |
7 | ## Lesson design
8 |
9 | - This lesson takes about 100-115 minutes with learners installing the tool and working through the examples and challenges.
10 |
11 | ## Technical tips and tricks
12 |
13 | Ask the learners to install and test running the program before the workshop. This will reveal usual problems that can be fixed before the workshop.
14 |
15 | ### OpenRefine version
16 |
17 | The current version of the lesson has been tested with OpenRefine 3.7.2. Using older versions is not recommended, behavior may be different and cause confusion in the learners.
18 |
19 | Windows users should download the "Windows (with Java)" version from the [Download page](https://openrefine.org/download.html) to avoid having to install Java.
20 |
21 | Mac users can use the kit available in the [Download page](https://openrefine.org/download.html), Java does not have to be installed separately.
22 |
23 | Linux users must install Java in their system.
24 |
25 | ### Creating a Project
26 |
27 | Start the program. (Double-click on the openrefine.exe file. A command line box might show up, this needs to be left open, and OpenRefine will open in the browser).
28 |
29 | Note the file types OpenRefine handles: TSV, CSF, \*SV, Excel (.xls .xlsx), JSON, XML, RDF as XML, Google Data documents. Support for other formats can be added with OpenRefine extensions.
30 |
31 | In this first step, we'll browse our computer to the sample data file for this lesson (If you haven't already, download the data from:
32 | [https://ndownloader.figshare.com/files/7823341](https://ndownloader.figshare.com/files/7823341)). In this case, I've modified the Portal\_rodents.csv file. I added several columns: scientificName, locality, county, state, country and I generated several more columns in the lesson itself (JSON, decimalLatitude, decimalLongitude). Data in locality, county, country, JSON, decimalLatitude and decimalLongitude are contrived and are in no way related to the original dataset.
33 |
34 | **Once OpenRefine is open, you'll be asked if you want to Create, Open, or Import a Project.**
35 |
36 | - Click Browse, find Portal\_rodents\_19772002\_scinameUUIDs.csv
37 | - Click next to open Portal\_rodents\_19772002\_scinameUUIDs.csv
38 | - OpenRefine gives you a preview - a chance to show you it understood the file. If, for example, your file was really tab-delimited, the preview might look strange, you would choose the correct separator in the box shown and click "update preview."
39 | - If all looks well, click *Create Project.*
40 |
41 | ### Faceting
42 |
43 | *Exploring data by applying multiple filters*
44 |
45 | OpenRefine supports faceted browsing as a mechanism for
46 |
47 | - seeing a big picture of your data, and
48 | - filtering down to just the subset of rows that you want to change in bulk.
49 |
50 | Typically, you create a facet on a particular column. The facet summarizes the cells in that column to give you a big picture of that column, and allows you to filter to some subset of rows for which their cells in that column satisfy some constraint. That's a bit abstract, so let's jump into some examples.
51 |
52 | [More on faceting](https://docs.openrefine.org/manual/facets/)
53 |
54 | - Scroll over to the scientificName column
55 | - Click the down arrow and choose Facet > Text facet
56 | - In the left margin, you'll see a box containing every unique value in the scientificName column and OpenRefine shows you how many times that value occurs in the column (a count), and allows you to sort (order) your facets by name or count.
57 | - Edit. Note that at any time, in any cell of the Facet box, or data cell in the OpenRefine window, you have access to "edit" and can fix an error immediately. OpenRefine will even ask you if you'd like to make that same correction to every value it finds like that one (or not).
58 |
59 | ### Clustering
60 |
61 | In OpenRefine, clustering refers to the operation of "finding groups of different values that might be alternative representations of the same thing". For example, the two strings "New York" and "new york" are very likely to refer to the same concept and just have capitalization differences. Likewise, "Gödel" and "Godel" probably refer to the same person.
62 |
63 | One of the most magical bits of OpenRefine, the moment you realize what you've been missing. OpenRefine has several clustering algorithms built in. Experiment with them, and learn more about these algorithms and how they work.
64 |
65 | [More on clustering](https://docs.openrefine.org/next/technical-reference/clustering-in-depth)
66 |
67 | - In this example, in the scientificName Text Facet we created in the step above, click the *Cluster* button.
68 | - In the resulting pop-up window, you can change the algorithm method, and keying function. Try different combinations to see the difference.
69 | - For example, with this dataset, the *nearest neighbor* method with the *PPM* keying function shows the power of clustering the best.
70 | - Intentional errors in these scientific names have been introduced to show how errors (typos) in any position can be found with this method. All errors can then be fixed by simply entering the correct value in the box on the right. Often, the algorithm has guessed correctly.
71 | - After corrections are made in this window, you can either Merge and Close the Cluster pop-up, or Merge and Re-cluster.
72 |
73 | ### Split / Undo - Redo
74 |
75 | If data in a column needs to be split into multiple columns, and the strings in the cells are separated by a common separator (say a comma, or a space), you can use that separator to divide up the bits into their own columns.
76 |
77 | - Go to the drop-down tab at the top of the column that you need to split into multiple columns
78 | - For example, go to the scientificName column > from drop-down choose Edit Column > Split into several columns
79 | - In the pop-up, for separator, remove the comma, put in a space
80 | - Remove the check in the box that says "remove column after splitting"
81 | - You'll get two extra columns called, in this case: scientificName 1, scientificName 2
82 | - To Undo create columns, look just above the scientificName cluster in the left side of the screen. Click where it says Undo / Redo. Click back one step (all steps, all changes are saved here). Just go back to the previous step and click. The extra columns will be gone.
83 |
84 | ## Common problems
85 |
86 | - If learners are using a browser other than Firefox, or OpenRefine does not automatically open for them when they click the .exe file, have them point their browser at [http://127.0.0.1:3333/](https://127.0.0.1:3333/) or [http://localhost:3333](https://localhost:3333) to launch the program.
87 |
88 | - Mac users with the newest operating system will have to allow this to run by "allowing everything" to run. They can change the setting back after the exercise.
89 |
90 | - Some students will run into issues with
91 |
92 | - unzipping, don't run from the zip file
93 | - finding the .exe file once the software has been unzipped
94 | - finding the data file on their computers after downloading
95 |
96 |
97 |
--------------------------------------------------------------------------------
/learners/discuss.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Discussion
3 | ---
4 |
5 | No current discussion
6 |
7 |
8 |
--------------------------------------------------------------------------------
/learners/reference.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: 'Glossary'
3 | ---
4 |
5 | ## Glossary
6 |
7 |
8 |
--------------------------------------------------------------------------------
/learners/setup.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Setup
3 | ---
4 |
5 | :::::::::::::::::::::::::::::::::::::::::: prereq
6 |
7 | ## Data
8 |
9 | **Download** the data file [Portal\_rodents\_19772002\_simplified.csv](data/Portal_rodents_19772002_simplified.csv), which is a csv file that will open in a new browser tab. Be sure to right click or control click in order to save the file (NOTE: In Safari, right click and select `Download linked file`; in Chrome and Firefox, right-click and select `Save link as...`). Make a note of the location (i.e. the folder, your Desktop) to which you save the file.
10 |
11 | ### About the data
12 |
13 | The data for this lesson is a part of the Data Carpentry Ecology workshop.
14 | It is a teaching version of the Portal Database. The data in this lesson
15 | is a subset of the teaching version that has been intentionally 'messed up'
16 | for this lesson.
17 |
18 | The data for this lesson and the workshop are in the
19 | [Portal Project Teaching Database](https://figshare.com/articles/Portal_Project_Teaching_Database/1314459)
20 | available on FigShare, with a CC-BY license
21 | available for reuse.
22 |
23 |
24 | ::::::::::::::::::::::::::::::::::::::::::::::::::
25 |
26 | :::::::::::::::::::::::::::::::::::::::::: prereq
27 |
28 | ## Software
29 |
30 | For this lesson you will need **OpenRefine version 3.7.2** and a web browser.
31 |
32 | Note: OpenRefine is a Java program that runs on your machine (not in the cloud). It runs inside your browser, but no web connection is needed.
33 |
34 | Download OpenRefine version 3.7.2 from [https://openrefine.org/download](https://openrefine.org/download).
35 |
36 | - Do not download beta versions or the release candidates. These are only for development and testing of the software.
37 | - If you are on Windows and do not have Java installed, download the version `Windows (including Java)`.
38 | - Unzip the downloaded file into a directory and name that directory something like OpenRefine.
39 | - Check below for further instructions depending on your operating system.
40 |
41 | ### Windows
42 |
43 | 1. Go to your newly created OpenRefine directory.
44 | 2. Launch OpenRefine by double clicking on `openrefine.exe` (this will launch a black command prompt window first; ignore this window, and wait for OpenRefine to launch in the web browser, which is where you will interact with the program).
45 |
46 | - If Windows displays a blue notification titled `Microsoft Defender SmartScreen prevented an unrecognized app from starting`, click on `More info` and then click on `Run anyway`.
47 |
48 | 1. If you are using a different browser, or OpenRefine does not automatically open for you, point your browser at [http://127.0.0.1:3333/](https://127.0.0.1:3333/) or [http://localhost:3333](https://localhost:3333) to launch the program.
49 |
50 | ### Mac
51 |
52 | 1. Go to your newly created OpenRefine directory.
53 | 2. Drag the OpenRefine icon into Applications folder, and `Ctrl-click/Open…` it.
54 |
55 | - If Mac shows a notification when you try to run the program that it cannot verify the developer, click `Cancel`. Then, `Right-click` or `Ctrl-click` the icon and select `Open`. The notification will now have an `Open` button. If it does not allow to open the program, repeat the process and there will be an `Open` button the second time. For additional details, consult the [OpenRefine installation guide](https://docs.openrefine.org/manual/installing#install-or-upgrade-openrefine).
56 |
57 | 1. If you are using a different browser, or OpenRefine does not automatically open for you, point your browser at [http://127.0.0.1:3333/](https://127.0.0.1:3333/) or [http://localhost:3333](https://localhost:3333) to launch the program.
58 |
59 | ### Linux
60 |
61 | 1. Navigate to your newly created OpenRefine directory using the command line.
62 | 2. Type `./refine` into the terminal within the OpenRefine directory
63 | 3. If you are using a different browser, or OpenRefine does not automatically open for you, point your browser at [http://127.0.0.1:3333/](https://127.0.0.1:3333/) or [http://localhost:3333](https://localhost:3333) to launch the program.
64 |
65 | ## Web Browser
66 |
67 | OpenRefine requires one of these web browsers installed in your computer:
68 |
69 | - Google Chrome
70 | - Chromium
71 | - Safari
72 | - Opera
73 | - Microsoft Edge
74 |
75 | OpenRefine has some issues with Firefox. Internet Explorer is not supported.
76 |
77 | Note: Other versions of OpenRefine should work, but the results might be different due to changes in the software or default settings.
78 |
79 |
80 | ::::::::::::::::::::::::::::::::::::::::::::::::::
81 |
82 |
83 |
--------------------------------------------------------------------------------
/profiles/learner-profiles.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: FIXME
3 | ---
4 |
5 | This is a placeholder file. Please add content here.
6 |
--------------------------------------------------------------------------------
/site/README.md:
--------------------------------------------------------------------------------
1 | This directory contains rendered lesson materials. Please do not edit files
2 | here.
3 |
--------------------------------------------------------------------------------