Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # library(glue)
- # library(purrr)
- # library(rlang)
- pad_transformer <- function(code, envir) {
- if (grepl("[*]$", code)) {
- code <- stringr::str_replace(code, "[*]$", "")
- res <- glue::evaluate(code, envir)
- stringr::str_pad(res, 3, "left", "0")
- } else {
- glue::evaluate(code, envir)
- }
- }
- acs_vars <- function(..., .envir = parent.frame()) {
- glue::glue(..., .envir = .envir, .transformer = pad_transformer)
- }
- acs_sum <- function(..., na.rm = TRUE, .envir = parent.frame()) {
- list(...) %>%
- purrr::map(acs_vars) %>%
- purrr::flatten_chr() %>%
- purrr::map(~rlang::eval_tidy(rlang::sym(.x), env = .envir)) %>%
- as.data.frame() %>%
- rowSums(na.rm = na.rm)
- }
- library(dplyr)
- df <- tibble(
- endyear = 2009:2011,
- b01001_e001 = c(1, 2, 3),
- b01001_e003 = c(NA, 1, NA),
- b01001_e002 = c(NA, 1, NA))
- df %>%
- mutate(
- foo = acs_sum("b01001_e{1:3*}"),
- bar = acs_sum("b01001_e001", "b01001_e002", "b01001_e003"),
- baz = acs_sum("b01001_e{1:2*}", "b01001_e003")
- )
- #> # A tibble: 3 x 7
- #> endyear b01001_e001 b01001_e003 b01001_e002 foo bar baz
- #> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
- #> 1 2009 1 NA NA 1 1 1
- #> 2 2010 2 1 1 4 4 4
- #> 3 2011 3 NA NA 3 3 3
- df %>%
- mutate(
- foo = case_when(
- endyear == 2009L ~ acs_sum("b01001_e{1:3*}"),
- endyear == 2010L ~ acs_sum("b01001_e001", "b01001_e002", "b01001_e003"),
- endyear == 2011L ~ acs_sum("b01001_e{1:2*}", "b01001_e003")
- )
- )
- #> # A tibble: 3 x 5
- #> endyear b01001_e001 b01001_e003 b01001_e002 foo
- #> <int> <dbl> <dbl> <dbl> <dbl>
- #> 1 2009 1 NA NA 1
- #> 2 2010 2 1 1 4
- #> 3 2011 3 NA NA 3
Add Comment
Please, Sign In to add comment