├── .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 | ![Graph representation of a pull request](https://carpentries.github.io/sandpaper/articles/img/pr-flow.dot.svg) 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 | [![Create a Slack Account with us](https://img.shields.io/badge/Create_Slack_Account-The_Carpentries-071159.svg)](https://slack-invite.carpentries.org/) 2 | [![Slack Status](https://img.shields.io/badge/Slack_Channel-dc--ecology--openref-E01563.svg)](https://carpentries.slack.com/messages/C9Y0RDGPQ) 3 | [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.570048.svg)](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 ![good\_first\_issue](https://img.shields.io/badge/-good%20first%20issue-gold.svg). 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 | ![](fig/or372-create-project.png){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 | ![](fig/or362-facet-menu.png){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 | ![](fig/or362-faceted-scientificname.png){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 | ![](fig/or372-scatterplots.png){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 | ![](fig/or362-undoredo.png){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 | ![](fig/or372-joincols.png){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 | ![](fig/or362-clustering.png){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 | ![](fig/or362-clustering-result.png){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 | ![](fig/or362-filter-scientificname.png){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 | ![](fig/or362-reconcile-add.png){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 | ![](fig/or362-reconcile.png){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 | ![](fig/or372-reconcile-results.png){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 | ![](fig/or362-reconcile-id.png){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 | ![](fig/or362-data-from-url.png){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 | ![](fig/or372-fetch-gbifjson.png){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 | ![](fig/or362-parse-json.png){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 | --------------------------------------------------------------------------------