Guest User

Untitled

a guest
Nov 23rd, 2017
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.87 KB | None | 0 0
  1. # library(glue)
  2. # library(purrr)
  3. # library(rlang)
  4.  
  5. pad_transformer <- function(code, envir) {
  6. if (grepl("[*]$", code)) {
  7. code <- stringr::str_replace(code, "[*]$", "")
  8. res <- glue::evaluate(code, envir)
  9. stringr::str_pad(res, 3, "left", "0")
  10. } else {
  11. glue::evaluate(code, envir)
  12. }
  13. }
  14.  
  15. acs_vars <- function(..., .envir = parent.frame()) {
  16. glue::glue(..., .envir = .envir, .transformer = pad_transformer)
  17. }
  18.  
  19. acs_sum <- function(..., na.rm = TRUE, .envir = parent.frame()) {
  20. list(...) %>%
  21. purrr::map(acs_vars) %>%
  22. purrr::flatten_chr() %>%
  23. purrr::map(~rlang::eval_tidy(rlang::sym(.x), env = .envir)) %>%
  24. as.data.frame() %>%
  25. rowSums(na.rm = na.rm)
  26. }
  27.  
  28.  
  29. library(dplyr)
  30.  
  31. df <- tibble(
  32. endyear = 2009:2011,
  33. b01001_e001 = c(1, 2, 3),
  34. b01001_e003 = c(NA, 1, NA),
  35. b01001_e002 = c(NA, 1, NA))
  36.  
  37. df %>%
  38. mutate(
  39. foo = acs_sum("b01001_e{1:3*}"),
  40. bar = acs_sum("b01001_e001", "b01001_e002", "b01001_e003"),
  41. baz = acs_sum("b01001_e{1:2*}", "b01001_e003")
  42. )
  43.  
  44. #> # A tibble: 3 x 7
  45. #> endyear b01001_e001 b01001_e003 b01001_e002 foo bar baz
  46. #> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
  47. #> 1 2009 1 NA NA 1 1 1
  48. #> 2 2010 2 1 1 4 4 4
  49. #> 3 2011 3 NA NA 3 3 3
  50.  
  51. df %>%
  52. mutate(
  53. foo = case_when(
  54. endyear == 2009L ~ acs_sum("b01001_e{1:3*}"),
  55. endyear == 2010L ~ acs_sum("b01001_e001", "b01001_e002", "b01001_e003"),
  56. endyear == 2011L ~ acs_sum("b01001_e{1:2*}", "b01001_e003")
  57. )
  58. )
  59.  
  60. #> # A tibble: 3 x 5
  61. #> endyear b01001_e001 b01001_e003 b01001_e002 foo
  62. #> <int> <dbl> <dbl> <dbl> <dbl>
  63. #> 1 2009 1 NA NA 1
  64. #> 2 2010 2 1 1 4
  65. #> 3 2011 3 NA NA 3
Add Comment
Please, Sign In to add comment