{"id":14068322,"url":"https://github.com/mkearney/tbltools","last_synced_at":"2025-09-07T06:36:26.289Z","repository":{"id":124079436,"uuid":"152122857","full_name":"mkearney/tbltools","owner":"mkearney","description":"🗜🔢 Tools for Working with Tibbles","archived":false,"fork":false,"pushed_at":"2019-02-08T16:29:24.000Z","size":598,"stargazers_count":36,"open_issues_count":3,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-09-07T06:36:07.951Z","etag":null,"topics":["frequency-table","mkearney-r-package","r","r-package","rstats","table","tibble","tidyverse"],"latest_commit_sha":null,"homepage":"https://github.com/mkearney/tbltools","language":"R","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mkearney.png","metadata":{"files":{"readme":"README.Rmd","changelog":"NEWS.md","contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-10-08T17:55:43.000Z","updated_at":"2025-03-22T11:00:05.000Z","dependencies_parsed_at":null,"dependency_job_id":"f346f785-533d-4fd9-91b7-19ec8f6588d2","html_url":"https://github.com/mkearney/tbltools","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/mkearney/tbltools","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mkearney%2Ftbltools","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mkearney%2Ftbltools/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mkearney%2Ftbltools/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mkearney%2Ftbltools/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mkearney","download_url":"https://codeload.github.com/mkearney/tbltools/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mkearney%2Ftbltools/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":274005336,"owners_count":25205934,"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","status":"online","status_checked_at":"2025-09-07T02:00:09.463Z","response_time":67,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["frequency-table","mkearney-r-package","r","r-package","rstats","table","tibble","tidyverse"],"created_at":"2024-08-13T07:06:05.806Z","updated_at":"2025-09-07T06:36:26.266Z","avatar_url":"https://github.com/mkearney.png","language":"R","funding_links":[],"categories":["R"],"sub_categories":[],"readme":"---\noutput: github_document\n---\n\n\u003c!-- README.md is generated from README.Rmd. Please edit that file --\u003e\n\n```{r setup, include = FALSE}\nknitr::opts_chunk$set(echo = TRUE, collapse = TRUE, comment = \"#\u003e\")\nlibrary(tbltools)\noptions(tbltools.print_tibble = FALSE, tbltools.print_n = 4)\n## function to compare with dplyr (ignore non data.frame class diffs)\nsame_as_dplyr \u003c- function(d1, d2) {\n  if (identical(d1, d2)) return(TRUE)\n  if (is.data.frame(d1) \u0026\u0026 is.data.frame(d2)) {\n    d1 \u003c- as.data.frame(d1)\n    d1at \u003c- attributes(d1)\n    attributes(d1) \u003c- d1at[order(names(d1at))]\n    d2 \u003c- as.data.frame(d2)\n    d2at \u003c- attributes(d2)\n    attributes(d2) \u003c- d2at[order(names(d2at))]\n  }\n  identical(d1, d2)\n}\nset.seed(12)\n```\n# tbltools \u003cimg src=\"man/figures/logo.png\" width=\"160px\" align=\"right\" /\u003e\n\n[![Build status](https://travis-ci.org/mkearney/tbltools.svg?branch=master)](https://travis-ci.org/mkearney/tbltools)\n[![CRAN status](https://www.r-pkg.org/badges/version/tbltools)](https://cran.r-project.org/package=tbltools)\n[![Coverage status](https://codecov.io/gh/mkearney/tbltools/branch/master/graph/badge.svg)](https://codecov.io/github/mkearney/tbltools?branch=master)\n\n![Downloads](https://cranlogs.r-pkg.org/badges/tbltools)\n![Downloads](https://cranlogs.r-pkg.org/badges/grand-total/tbltools)\n[![lifecycle](https://img.shields.io/badge/lifecycle-experimental-orange.svg)](https://www.tidyverse.org/lifecycle/#experimental)\n\nTools for Working with Tibbles\n\n## Installation\n\nInstall from CRAN with:\n\n```{r, eval=FALSE}\n## install {tbltools} from CRAN\ninstall.packages(\"tbltools\")\n```\n\nOr install the development version from Github with:\n\n```{r, eval=FALSE}\n## install remotes pkg if not already\nif (!requireNamespace(\"remotes\")) {\n  install.packages(\"remotes\")\n}\n\n## install from github\nremotes::install_github(\"mkearney/tbltools\")\n```\n\n## Features\n+ [Tidyverse](https://tidyverse.org)-style operability!\n   - Uses non-standard evaluation for **easy interactive analysis**\n   - Provides numerous [{dplyr}](https://dplyr.tidyverse.org)-like\n   **wrangling functions**:\n      + `slice_data()`, `arrange_data()` `filter_data()`, `select_data()`, \n      `mutate_data()`, `summarise_data()`, `bind_rows_data()`, \n      `bind_cols_data()`, `full_join_data()`, `left_join_data()`, \n      `right_join_data()`\n+ Extremely lightweight!\n   - Requires only base R–**zero dependencies**)\n   - Installs/compiles **quickly and easily**\n+ Simple and effective data frame printing!\n   - Provides a [{tibble}](https://tibble.tidyverse.org)-like printing experience\n\n## Use\n\n+ **`as_tbl_data()`**: Convert data frames to tibbles\n\n```{r}\n## convert mtcars to tibble and create row_names variable\nd \u003c- as_tbl_data(mtcars, row_names = TRUE)\n```\n\n+ **`tbl_dat_frame()`**: Create data frames\n   - Evaluated within data frame environment, so variables/values can be updated \n   within the `tbl_data_frame()` call\n\n```{r}\n## create data frame where 2 variable depends on evaluation of 1st variable\ntbl_data_frame(\n  x = rnorm(20),\n  y = rnorm(20) + x\n) %\u003e%\n  cor()\n```\n\n### Slice\n\n+ **`slice_data()`**: Select/keep/return row positions\n\n```{r}\n## select rows 1, 3, 5, 25 of data\nslice_data(d, c(1, 3, 5, 25))\n```\n\nCompare with `dplyr::slice()`\n\n```{r}\nsame_as_dplyr(\n  slice_data(d, c(1, 3, 5, 25)),\n  dplyr::slice(d, c(1, 3, 5, 25))\n)\n```\n\n\n### Filter\n\n+ **`filter_data()`**: Filter/keep/return certain rows\n\n```{r}\n## count by cyl and gear\nfilter_data(d, gear \u003e 3 | mpg \u003e 30, vs == 1)\n```\n\nCompare with `dplyr::filter()`\n\n```{r}\nsame_as_dplyr(\n  filter_data(d, gear \u003e 3 | mpg \u003e 30, vs == 1),\n  dplyr::filter(d, gear \u003e 3 | mpg \u003e 30, vs == 1)\n)\n```\n\n### Arrange\n\n+ **`arrange_data()`**: Organize rows by column(s) value\n\n```{r}\n## count by cyl and gear\narrange_data(d, gear, cyl)\n```\n\nCompare with `dplyr::arrange()`\n\n```{r}\nsame_as_dplyr(\n  arrange_data(d, gear, cyl),\n  dplyr::arrange(d, gear, cyl)\n)\n```\n\n### Select\n\n+ **`select_data()`**: Select columns of data frame\n\n```{r}\n## select only these columns\nselect_data(d, row_names:hp, -disp, gear, weight = wt)\n```\n\nCompare with `dplyr::select()`\n\n```{r}\nsame_as_dplyr(\n  select_data(d, cyl, gear, weight = wt),\n  dplyr::select(d, cyl, gear, weight = wt)\n)\n```\n\n### Mutate\n\n+ **`mutate_data()`**: Wrangle/create variables in data frame\n\n```{r}\n## select cyl, gear, mpg columns and create new logical column for more efficient cars\nd %\u003e%\n  select_data(cyl, gear, mpg) %\u003e%\n  mutate_data(eff = mpg \u003e 20)\n```\n\nCompare with `dplyr::mutate()`\n\n```{r}\nsame_as_dplyr(\n  d %\u003e%\n    select_data(cyl, gear, mpg) %\u003e%\n    mutate_data(eff = mpg \u003e 20),\n  d %\u003e%\n    dplyr::select(cyl, gear, mpg) %\u003e%\n    dplyr::mutate(eff = mpg \u003e 20)\n)\n```\n\n### Summarise\n\n+ **`summarise_data()`**: Wrangle/create summary variables in data frame\n\n```{r}\n## select cyl, gear, mpg columns and create new logical column for more efficient cars\nsummarise_data(d, mpg = mean(mpg), wt = mean(wt))\n```\n\nCompare with `dplyr::summarise()`\n\n```{r}\nsame_as_dplyr(\n  summarise_data(d, mpg = mean(mpg), wt = mean(wt)),\n  dplyr::summarise(d, mpg = mean(mpg), wt = mean(wt))\n)\n```\n\n### Group by\n\n+ **`group_by_data()`**: Group observations in data frame [and then mutate and/or summarise]\n\n```{r}\n## group by cyl\nd %\u003e%\n  select_data(mpg:cyl, gear) %\u003e%\n  group_by_data(cyl, gear) %\u003e%\n  mutate_data(n = length(gear)) %\u003e%\n  summarise_data(\n    n = unique(n),\n    mpg = mean(mpg)\n  )\n```\n\nCompare with `dplyr::group_by()`\n\n```{r}\nsame_as_dplyr(\n  d %\u003e%\n    select_data(cyl, gear, mpg) %\u003e%\n    group_by_data(cyl) %\u003e%\n    mutate_data(n = length(gear)) %\u003e%\n    summarise_data(\n      n = unique(n),\n      mpg_total = sum(mpg),\n      mpg = mean(mpg)\n    ) %\u003e%\n    arrange_data(cyl) %\u003e%\n    select_data(cyl, mpg_total, mpg, n),\n  d %\u003e%\n    dplyr::select(cyl, gear, mpg) %\u003e%\n    dplyr::group_by(cyl) %\u003e%\n    dplyr::mutate(n = length(gear)) %\u003e%\n    dplyr::summarise(\n      n = unique(n),\n      mpg_total = sum(mpg),\n      mpg = mean(mpg)\n    ) %\u003e%\n    dplyr::arrange(cyl) %\u003e%\n    dplyr::select(cyl, mpg_total, mpg, n)\n)\n```\n\n### Bind rows\n\n+ **`bind_rows_data()`**: Collapse list of data frames into single data frame\n\n```{r}\n## create version of data with new variable\ndd \u003c- d\ndd$new_var \u003c- sample(letters, nrow(d), replace = TRUE)\n\n## combine multiple data sets into list\nlst \u003c- list(d, d, dd)\n\n## bind rows into single data frame\nbind_rows_data(lst, fill = TRUE)\n```\n\nCompare to `dplyr::bind_rows()`\n\n```{r}\nsame_as_dplyr(\n  bind_rows_data(lst, fill = TRUE),\n  dplyr::bind_rows(lst)\n)\n```\n\n### Joins\n\n+ Data to compare with [dplyr](https://github.com/tidyverse/dplyr) joins:\n\n```{r}\n## mtcars data and additional cyl/new data\nx \u003c- tbltools::as_tbl_data(mtcars)\ny \u003c- data.frame(cyl = c(1, 4), new = c(1.25, 2.5))\n```\n\n+ **`left_join_data()`**: Join according to first (left) data frame\n\n```{r}\n## join according to x\nleft_join_data(x, y)\n```\n\nCompare with `dplyr::left_join()`:\n\n```{r}\nsame_as_dplyr(\n  left_join_data(x, y),\n  dplyr::left_join(x, y)\n)\n```\n\n+ **`right_join_data()`**: Join according to second (right) data frame\n\n```{r}\n## join by y\nright_join_data(x, y)\n```\n\nCompare with `dplyr::left_join()`:\n\n```{r}\nsame_as_dplyr(\n  right_join_data(x, y),\n  dplyr::right_join(x, y)\n)\n```\n\n+ **`full_join_data()`**: Join according to both data frames\n\n```{r}\n## join by x and y\nfull_join_data(x, y)\n```\n\nCompare with `dplyr::left_join()`:\n\n```{r}\nsame_as_dplyr(\n  full_join_data(x, y),\n  dplyr::full_join(x, y)\n)\n```\n\n### Frequency tables\n\n+ **`tabsort()`**: Count frequencies\n\n```{r}\n## count by cyl and gear\ntabsort(d, cyl, gear)\n```\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmkearney%2Ftbltools","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmkearney%2Ftbltools","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmkearney%2Ftbltools/lists"}