keyholder
is a package for storing information (keys) about rows of
data frame like objects. The common use cases are to track rows of data
without modifying it and to backup and restore information about rows.
This is done with creating a class keyed_df which has special
attribute “keys”. Keys are updated according to changes in rows of
reference data frame.
keyholder
is designed to work tightly with
dplyr package. All its one- and
two-table verbs update keys properly.
You can install current stable version from CRAN with:
install.packages("keyholder")
Also you can install development version from github with:
# install.packages("devtools")
devtools::install_github("echasnovski/keyholder")
keyholder
provides a set of functions to work with keys:
assign_keys()
and key_by()
.keys()
. Get one specific key with pull_key()
.restore_keys()
and
its scoped variants (*_all()
, *_if()
and *_at()
).rename_keys()
and its scoped variants.remove_keys()
and its scoped variants.
Completely unkey object with unkey()
.use_id()
and special .id
key.For more detailed explanations and examples see package vignettes and documentation.
library(dplyr)
library(keyholder)
mtcars_tbl <- mtcars %>% as_tibble()
mtcars_tbl_id <- mtcars_tbl %>%
# Creates a key '.id' with row index
use_id() %>%
filter(vs == 1, gear == 4)
mtcars_tbl_id
#> # A keyed object. Keys: .id
#> # A tibble: 10 × 11
#> mpg cyl disp hp drat wt qsec vs am gear carb
#> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 22.8 4 108 93 3.85 2.32 18.6 1 1 4 1
#> 2 24.4 4 147. 62 3.69 3.19 20 1 0 4 2
#> 3 22.8 4 141. 95 3.92 3.15 22.9 1 0 4 2
#> # … with 7 more rows
mtcars_tbl_id %>% pull_key(.id)
#> [1] 3 8 9 10 11 18 19 20 26 32
mtcars_tbl_keyed <- mtcars_tbl %>%
# Backup
key_by(vs, am, gear) %>%
# Modify
mutate(vs = am) %>%
group_by(vs) %>%
mutate(gear = max(gear))
# Restore with recomputing groups
mtcars_tbl_restored <- mtcars_tbl_keyed %>% restore_keys_all()
mtcars_tbl_grouped <- mtcars_tbl %>% group_by(vs)
all.equal(
as.data.frame(mtcars_tbl_restored),
as.data.frame(mtcars_tbl_grouped),
check.attributes = FALSE
)
#> [1] TRUE
all.equal(
group_indices(mtcars_tbl_restored),
group_indices(mtcars_tbl_grouped)
)
#> [1] TRUE
# Restore with renaming
mtcars_tbl_keyed %>%
restore_keys_at("vs", .funs = list(~ paste0(., "_old")))
#> # A keyed object. Keys: vs, am, gear
#> # A tibble: 32 × 12
#> # Groups: vs [2]
#> mpg cyl disp hp drat wt qsec vs am gear carb vs_old
#> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 21 6 160 110 3.9 2.62 16.5 1 1 5 4 0
#> 2 21 6 160 110 3.9 2.88 17.0 1 1 5 4 0
#> 3 22.8 4 108 93 3.85 2.32 18.6 1 1 5 1 1
#> # … with 29 more rows
dplyr
’s *_if scoped variants of verbs:# Restored key goes to the end of the tibble
mtcars_tbl %>%
key_by(mpg, .exclude = TRUE) %>%
mutate_if(is.numeric, round, digits = 0) %>%
restore_keys_all()
#> # A keyed object. Keys: mpg
#> # A tibble: 32 × 11
#> cyl disp hp drat wt qsec vs am gear carb mpg
#> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 6 160 110 4 3 16 0 1 4 4 21
#> 2 6 160 110 4 3 17 0 1 4 4 21
#> 3 4 108 93 4 2 19 1 1 4 1 22.8
#> # … with 29 more rows
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.