{"id":18501588,"url":"https://github.com/const-ae/tidygenomics","last_synced_at":"2025-04-09T18:33:18.834Z","repository":{"id":52883522,"uuid":"90560815","full_name":"const-ae/tidygenomics","owner":"const-ae","description":"Tidy Verbs for Dealing with Genomic Data Frames https://const-ae.github.io/tidygenomics/","archived":false,"fork":false,"pushed_at":"2021-04-15T07:00:02.000Z","size":211,"stargazers_count":103,"open_issues_count":1,"forks_count":5,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-03-23T20:37:02.891Z","etag":null,"topics":["genomics","intervals","r-package","r-stats","tidy"],"latest_commit_sha":null,"homepage":"","language":"R","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/const-ae.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-05-07T20:45:40.000Z","updated_at":"2025-02-06T18:42:49.000Z","dependencies_parsed_at":"2022-08-21T06:20:45.728Z","dependency_job_id":null,"html_url":"https://github.com/const-ae/tidygenomics","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/const-ae%2Ftidygenomics","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/const-ae%2Ftidygenomics/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/const-ae%2Ftidygenomics/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/const-ae%2Ftidygenomics/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/const-ae","download_url":"https://codeload.github.com/const-ae/tidygenomics/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247596446,"owners_count":20964097,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["genomics","intervals","r-package","r-stats","tidy"],"created_at":"2024-11-06T13:54:21.359Z","updated_at":"2025-04-09T18:33:18.808Z","avatar_url":"https://github.com/const-ae.png","language":"R","funding_links":[],"categories":[],"sub_categories":[],"readme":"# tidygenomics\n\n[![CRAN_Status_Badge](https://www.r-pkg.org/badges/version/tidygenomics)](https://cran.r-project.org/package=tidygenomics)\n\nTidy Verbs for Dealing with Genomic Data Frames\n\n## Description\n\nHandle genomic data within data frames just as you would with `GRanges`.\nThis packages provides method to deal with genomics intervals the \"tidy-way\" which makes\nit simpler to integrate in the the general data munging process. The API is inspired by the\npopular bedtools and the genome_join() method from the fuzzyjoin package.\n\n## Installation\n\n```\ninstall.packages(\"tidygenomics\")\n```\n\nOr to get the latest development version\n```\ndevtools::install_github(\"const-ae/tidygenomics\")\n```\n\n## Documentation\n\n\n#### genome_intersect\n\nJoins 2 data frames based on their genomic overlap. Unlike the `genome_join` function it updates the boundaries to reflect\nthe overlap of the regions.\n\n\u003cimg src=\"vignettes/resources/genome_intersect_docu.png\" alt=\"genome_intersect\" style=\"width: 100%;\"/\u003e\n\n\n```{r}\nx1 \u003c- data.frame(id = 1:4, \n                chromosome = c(\"chr1\", \"chr1\", \"chr2\", \"chr2\"),\n                start = c(100, 200, 300, 400),\n                end = c(150, 250, 350, 450))\n\nx2 \u003c- data.frame(id = 1:4,\n                 chromosome = c(\"chr1\", \"chr2\", \"chr2\", \"chr1\"),\n                 start = c(140, 210, 400, 300),\n                 end = c(160, 240, 415, 320))\n\ngenome_intersect(x1, x2, by=c(\"chromosome\", \"start\", \"end\"), mode=\"both\")\n```\n\n| id.x|chromosome | id.y| start| end|\n|----:|:----------|----:|-----:|---:|\n|    1|chr1       |    1|   140| 150|\n|    4|chr2       |    3|   400| 415|\n\n#### genome_subtract\n\nSubtracts one data frame from the other. This can be used to split the x data frame into smaller areas.\n\n\u003cimg src=\"vignettes/resources/genome_subtract_docu.png\" alt=\"genome_subtract\" style=\"width: 100%;\"/\u003e\n\n```{r}\nx1 \u003c- data.frame(id = 1:4,\n                chromosome = c(\"chr1\", \"chr1\", \"chr2\", \"chr1\"),\n                start = c(100, 200, 300, 400),\n                end = c(150, 250, 350, 450))\n\nx2 \u003c- data.frame(id = 1:4,\n                chromosome = c(\"chr1\", \"chr2\", \"chr1\", \"chr1\"),\n                start = c(120, 210, 300, 400),\n                end = c(125, 240, 320, 415))\n\ngenome_subtract(x1, x2, by=c(\"chromosome\", \"start\", \"end\"))\n```\n\n| id|chromosome | start| end|\n|--:|:----------|-----:|---:|\n|  1|chr1       |   100| 119|\n|  1|chr1       |   126| 150|\n|  2|chr1       |   200| 250|\n|  3|chr2       |   300| 350|\n|  4|chr1       |   416| 450|\n\n\n#### genome_join_closest\n\nJoins 2 data frames based on their genomic location. If no exact overlap is found the next closest interval is used.\n\n\u003cimg src=\"vignettes/resources/genome_join_closest_docu.png\" alt=\"genome_join_closest\" style=\"width: 100%;\"/\u003e\n\n```{r}\nx1 \u003c- data_frame(id = 1:4, \n                 chr = c(\"chr1\", \"chr1\", \"chr2\", \"chr3\"),\n                 start = c(100, 200, 300, 400),\n                 end = c(150, 250, 350, 450))\n\nx2 \u003c- data_frame(id = 1:4,\n                 chr = c(\"chr1\", \"chr1\", \"chr1\", \"chr2\"),\n                 start = c(220, 210, 300, 400),\n                 end = c(225, 240, 320, 415))\ngenome_join_closest(x1, x2, by=c(\"chr\", \"start\", \"end\"), distance_column_name=\"distance\", mode=\"left\")\n```\n\n| id.x|chr.x | start.x| end.x| id.y|chr.y | start.y| end.y| distance|\n|----:|:-----|-------:|-----:|----:|:-----|-------:|-----:|--------:|\n|    1|chr1  |     100|   150|    2|chr1  |     210|   240|       59|\n|    2|chr1  |     200|   250|    1|chr1  |     220|   225|        0|\n|    2|chr1  |     200|   250|    2|chr1  |     210|   240|        0|\n|    3|chr2  |     300|   350|    4|chr2  |     400|   415|       49|\n|    4|chr3  |     400|   450|   NA|NA    |      NA|    NA|       NA|\n\n#### genome_cluster\n\nAdd a new column with the cluster if 2 intervals are overlapping or are within the `max_distance`.\n\n\u003cimg src=\"vignettes/resources/genome_cluster_docu.png\" alt=\"genome_cluster\" style=\"width: 100%;\"/\u003e\n\n```{r}\nx1 \u003c- data.frame(id = 1:4, bla=letters[1:4],\n                chromosome = c(\"chr1\", \"chr1\", \"chr2\", \"chr1\"),\n                start = c(100, 120, 300, 260),\n                end = c(150, 250, 350, 450))\ngenome_cluster(x1, by=c(\"chromosome\", \"start\", \"end\"))\n```\n\n| id|bla |chromosome | start| end| cluster_id|\n|--:|:---|:----------|-----:|---:|----------:|\n|  1|a   |chr1       |   100| 150|          0|\n|  2|b   |chr1       |   120| 250|          0|\n|  3|c   |chr2       |   300| 350|          2|\n|  4|d   |chr1       |   260| 450|          1|\n\n```{r}\ngenome_cluster(x1, by=c(\"chromosome\", \"start\", \"end\"), max_distance=10)\n```\n\n| id|bla |chromosome | start| end| cluster_id|\n|--:|:---|:----------|-----:|---:|----------:|\n|  1|a   |chr1       |   100| 150|          0|\n|  2|b   |chr1       |   120| 250|          0|\n|  3|c   |chr2       |   300| 350|          1|\n|  4|d   |chr1       |   260| 450|          0|\n\n#### genome_complement\n\nCalculates the complement of a genomic region.\n\n\u003cimg src=\"vignettes/resources/genome_complement_docu.png\" alt=\"genome_complement\" style=\"width: 100%;\"/\u003e\n\n```{r}\nx1 \u003c- data.frame(id = 1:4,\n                 chromosome = c(\"chr1\", \"chr1\", \"chr2\", \"chr1\"),\n                 start = c(100, 200, 300, 400),\n                 end = c(150, 250, 350, 450))\n\ngenome_complement(x1, by=c(\"chromosome\", \"start\", \"end\"))\n```\n\n|chromosome | start| end|\n|:----------|-----:|---:|\n|chr1       |     1|  99|\n|chr1       |   151| 199|\n|chr1       |   251| 399|\n|chr2       |     1| 299|\n\n\n#### genome_join\n\nClassical join function based on the overlap of the interval. Implemented and maintained in the\n[fuzzyjoin](https://github.com/dgrtwo/fuzzyjoin) package and documented here only for completeness.\n\n\u003cimg src=\"vignettes/resources/genome_join_docu.png\" alt=\"genome_join\" style=\"width: 100%;\"/\u003e\n\n```{r}\nx1 \u003c- data_frame(id = 1:4, \n                 chr = c(\"chr1\", \"chr1\", \"chr2\", \"chr3\"),\n                 start = c(100, 200, 300, 400),\n                 end = c(150, 250, 350, 450))\n\nx2 \u003c- data_frame(id = 1:4,\n                 chr = c(\"chr1\", \"chr1\", \"chr1\", \"chr2\"),\n                 start = c(220, 210, 300, 400),\n                 end = c(225, 240, 320, 415))\nfuzzyjoin::genome_join(x1, x2, by=c(\"chr\", \"start\", \"end\"), mode=\"inner\")\n```\n\n| id.x|chr.x | start.x| end.x| id.y|chr.y | start.y| end.y|\n|----:|:-----|-------:|-----:|----:|:-----|-------:|-----:|\n|    2|chr1  |     200|   250|    1|chr1  |     220|   225|\n|    2|chr1  |     200|   250|    2|chr1  |     210|   240|\n\n```{r}\nfuzzyjoin::genome_join(x1, x2, by=c(\"chr\", \"start\", \"end\"), mode=\"left\")\n```\n\n| id.x|chr.x | start.x| end.x| id.y|chr.y | start.y| end.y|\n|----:|:-----|-------:|-----:|----:|:-----|-------:|-----:|\n|    1|chr1  |     100|   150|   NA|NA    |      NA|    NA|\n|    2|chr1  |     200|   250|    1|chr1  |     220|   225|\n|    2|chr1  |     200|   250|    2|chr1  |     210|   240|\n|    3|chr2  |     300|   350|   NA|NA    |      NA|    NA|\n|    4|chr3  |     400|   450|   NA|NA    |      NA|    NA|\n\n```{r}\nfuzzyjoin::genome_join(x1, x2, by=c(\"chr\", \"start\", \"end\"), mode=\"anti\")\n```\n\n| id|chr  | start| end|\n|--:|:----|-----:|---:|\n|  1|chr1 |   100| 150|\n|  3|chr2 |   300| 350|\n|  4|chr3 |   400| 450|\n\n\n\n## Inspiration\n\n- [tidyverse](http://tidyverse.org/)\n- [fuzzyjoin](https://github.com/dgrtwo/fuzzyjoin)\n- [GenomicRanges](http://bioconductor.org/packages/release/bioc/html/GenomicRanges.html)\n- [bedtools](http://bedtools.readthedocs.io)\n\nIf you have any additional questions or encounter issues please raise them on the [github page](https://github.com/Artjom-Metro/tidygenomics).\n\n\n\n\n\n\n\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fconst-ae%2Ftidygenomics","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fconst-ae%2Ftidygenomics","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fconst-ae%2Ftidygenomics/lists"}