Skip to content

Instantly share code, notes, and snippets.

@njtierney
Created April 8, 2024 05:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save njtierney/8c71f9e99aac2fdff4c631e14c707a34 to your computer and use it in GitHub Desktop.
Save njtierney/8c71f9e99aac2fdff4c631e14c707a34 to your computer and use it in GitHub Desktop.
# something like this?
library(tidyverse)
library(lobstr)
existing_data_list <- list(
  data.frame(x = 1:5, y = 0),
  data.frame(z = 5:1),
  data.frame(y = 1:5, a = 2)
)

existing_data_list
#> [[1]]
#>   x y
#> 1 1 0
#> 2 2 0
#> 3 3 0
#> 4 4 0
#> 5 5 0
#> 
#> [[2]]
#>   z
#> 1 5
#> 2 4
#> 3 3
#> 4 2
#> 5 1
#> 
#> [[3]]
#>   y a
#> 1 1 2
#> 2 2 2
#> 3 3 2
#> 4 4 2
#> 5 5 2

new_names <- map(
  .x = existing_data_list, 
  .f = \(x) setdiff(c("x", "y", "z", "a"), names(x))
  )

new_names
#> [[1]]
#> [1] "z" "a"
#> 
#> [[2]]
#> [1] "x" "y" "a"
#> 
#> [[3]]
#> [1] "x" "z"

# this is what I want to do
existing_data_list[[1]][ new_names[[1]] ] <- NA
existing_data_list[[2]][new_names[[2]]] <- NA
existing_data_list[[3]][new_names[[3]]] <- NA

existing_data_list
#> [[1]]
#>   x y  z  a
#> 1 1 0 NA NA
#> 2 2 0 NA NA
#> 3 3 0 NA NA
#> 4 4 0 NA NA
#> 5 5 0 NA NA
#> 
#> [[2]]
#>   z  x  y  a
#> 1 5 NA NA NA
#> 2 4 NA NA NA
#> 3 3 NA NA NA
#> 4 2 NA NA NA
#> 5 1 NA NA NA
#> 
#> [[3]]
#>   y a  x  z
#> 1 1 2 NA NA
#> 2 2 2 NA NA
#> 3 3 2 NA NA
#> 4 4 2 NA NA
#> 5 5 2 NA NA

# understanding how this works
ast(existing_data_list[[1]][new_names[[1]]] <- NA)
#> █─`<-` 
#> ├─█─`[` 
#> │ ├─█─`[[` 
#> │ │ ├─existing_data_list 
#> │ │ └─1 
#> │ └─█─`[[` 
#> │   ├─new_names 
#> │   └─1 
#> └─NA
ast(`<-`(`[`(existing_data_list[[1]],new_names[[1]], value = NA)))
#> █─`<-` 
#> └─█─`[` 
#>   ├─█─`[[` 
#>   │ ├─existing_data_list 
#>   │ └─1 
#>   ├─█─`[[` 
#>   │ ├─new_names 
#>   │ └─1 
#>   └─value = NA
ast(`[<-`(existing_data_list[[1]],new_names[[1]], value = NA))
#> █─`[<-` 
#> ├─█─`[[` 
#> │ ├─existing_data_list 
#> │ └─1 
#> ├─█─`[[` 
#> │ ├─new_names 
#> │ └─1 
#> └─value = NA

existing_data_list
#> [[1]]
#>   x y  z  a
#> 1 1 0 NA NA
#> 2 2 0 NA NA
#> 3 3 0 NA NA
#> 4 4 0 NA NA
#> 5 5 0 NA NA
#> 
#> [[2]]
#>   z  x  y  a
#> 1 5 NA NA NA
#> 2 4 NA NA NA
#> 3 3 NA NA NA
#> 4 2 NA NA NA
#> 5 1 NA NA NA
#> 
#> [[3]]
#>   y a  x  z
#> 1 1 2 NA NA
#> 2 2 2 NA NA
#> 3 3 2 NA NA
#> 4 4 2 NA NA
#> 5 5 2 NA NA

# When trying to do this inside of map, this doesn't work?
give_new_names <- map2(
  .x = existing_data_list,
  .y = new_names,
  .f = function(data, new_names){
    `<-`(`[`(data, new_names), value = NA)
    data
  }
)

give_new_names
#> [[1]]
#>   x y  z  a
#> 1 1 0 NA NA
#> 2 2 0 NA NA
#> 3 3 0 NA NA
#> 4 4 0 NA NA
#> 5 5 0 NA NA
#> 
#> [[2]]
#>   z  x  y  a
#> 1 5 NA NA NA
#> 2 4 NA NA NA
#> 3 3 NA NA NA
#> 4 2 NA NA NA
#> 5 1 NA NA NA
#> 
#> [[3]]
#>   y a  x  z
#> 1 1 2 NA NA
#> 2 2 2 NA NA
#> 3 3 2 NA NA
#> 4 4 2 NA NA
#> 5 5 2 NA NA

add_new_columns <- function(data, cols, values){
  `<-`(`[`(data, cols), value = values)
  data
}

give_new_names <- map2(
  .x = existing_data_list,
  .y = new_names,
  .f = function(data, new_names){
    add_new_columns(data, new_names, NA)
  }
)

# yewwwww
give_new_names
#> [[1]]
#>   x y  z  a
#> 1 1 0 NA NA
#> 2 2 0 NA NA
#> 3 3 0 NA NA
#> 4 4 0 NA NA
#> 5 5 0 NA NA
#> 
#> [[2]]
#>   z  x  y  a
#> 1 5 NA NA NA
#> 2 4 NA NA NA
#> 3 3 NA NA NA
#> 4 2 NA NA NA
#> 5 1 NA NA NA
#> 
#> [[3]]
#>   y a  x  z
#> 1 1 2 NA NA
#> 2 2 2 NA NA
#> 3 3 2 NA NA
#> 4 4 2 NA NA
#> 5 5 2 NA NA

Created on 2024-04-08 with reprex v2.1.0

Session info
sessioninfo::session_info()
#> ─ Session info ───────────────────────────────────────────────────────────────
#>  setting  value
#>  version  R version 4.3.3 (2024-02-29)
#>  os       macOS Sonoma 14.3.1
#>  system   aarch64, darwin20
#>  ui       X11
#>  language (EN)
#>  collate  en_US.UTF-8
#>  ctype    en_US.UTF-8
#>  tz       Australia/Hobart
#>  date     2024-04-08
#>  pandoc   3.1.1 @ /Applications/RStudio.app/Contents/Resources/app/quarto/bin/tools/ (via rmarkdown)
#> 
#> ─ Packages ───────────────────────────────────────────────────────────────────
#>  package     * version date (UTC) lib source
#>  cli           3.6.2   2023-12-11 [1] CRAN (R 4.3.1)
#>  colorspace    2.1-0   2023-01-23 [1] CRAN (R 4.3.0)
#>  crayon        1.5.2   2022-09-29 [1] CRAN (R 4.3.0)
#>  digest        0.6.34  2024-01-11 [1] CRAN (R 4.3.1)
#>  dplyr       * 1.1.4   2023-11-17 [1] CRAN (R 4.3.1)
#>  evaluate      0.23    2023-11-01 [1] CRAN (R 4.3.1)
#>  fansi         1.0.6   2023-12-08 [1] CRAN (R 4.3.1)
#>  fastmap       1.1.1   2023-02-24 [1] CRAN (R 4.3.0)
#>  forcats     * 1.0.0   2023-01-29 [1] CRAN (R 4.3.0)
#>  fs            1.6.3   2023-07-20 [1] CRAN (R 4.3.0)
#>  generics      0.1.3   2022-07-05 [1] CRAN (R 4.3.0)
#>  ggplot2     * 3.5.0   2024-02-23 [1] CRAN (R 4.3.1)
#>  glue          1.7.0   2024-01-09 [1] CRAN (R 4.3.1)
#>  gtable        0.3.4   2023-08-21 [1] CRAN (R 4.3.0)
#>  hms           1.1.3   2023-03-21 [1] CRAN (R 4.3.0)
#>  htmltools     0.5.7   2023-11-03 [1] CRAN (R 4.3.1)
#>  knitr         1.45    2023-10-30 [1] CRAN (R 4.3.1)
#>  lifecycle     1.0.4   2023-11-07 [1] CRAN (R 4.3.1)
#>  lobstr      * 1.1.2   2022-06-22 [2] CRAN (R 4.3.0)
#>  lubridate   * 1.9.3   2023-09-27 [1] CRAN (R 4.3.1)
#>  magrittr      2.0.3   2022-03-30 [1] CRAN (R 4.3.0)
#>  munsell       0.5.0   2018-06-12 [1] CRAN (R 4.3.0)
#>  pillar        1.9.0   2023-03-22 [1] CRAN (R 4.3.0)
#>  pkgconfig     2.0.3   2019-09-22 [1] CRAN (R 4.3.0)
#>  purrr       * 1.0.2   2023-08-10 [1] CRAN (R 4.3.0)
#>  R.cache       0.16.0  2022-07-21 [2] CRAN (R 4.3.0)
#>  R.methodsS3   1.8.2   2022-06-13 [2] CRAN (R 4.3.0)
#>  R.oo          1.26.0  2024-01-24 [2] CRAN (R 4.3.1)
#>  R.utils       2.12.3  2023-11-18 [2] CRAN (R 4.3.1)
#>  R6            2.5.1   2021-08-19 [1] CRAN (R 4.3.0)
#>  readr       * 2.1.5   2024-01-10 [1] CRAN (R 4.3.1)
#>  reprex        2.1.0   2024-01-11 [2] CRAN (R 4.3.1)
#>  rlang         1.1.3   2024-01-10 [1] CRAN (R 4.3.1)
#>  rmarkdown     2.25    2023-09-18 [1] CRAN (R 4.3.1)
#>  rstudioapi    0.15.0  2023-07-07 [1] CRAN (R 4.3.0)
#>  scales        1.3.0   2023-11-28 [1] CRAN (R 4.3.1)
#>  sessioninfo   1.2.2   2021-12-06 [2] CRAN (R 4.3.0)
#>  stringi       1.8.3   2023-12-11 [1] CRAN (R 4.3.1)
#>  stringr     * 1.5.1   2023-11-14 [1] CRAN (R 4.3.1)
#>  styler        1.10.2  2023-08-29 [2] CRAN (R 4.3.0)
#>  tibble      * 3.2.1   2023-03-20 [1] CRAN (R 4.3.0)
#>  tidyr       * 1.3.1   2024-01-24 [1] CRAN (R 4.3.1)
#>  tidyselect    1.2.0   2022-10-10 [1] CRAN (R 4.3.0)
#>  tidyverse   * 2.0.0   2023-02-22 [2] CRAN (R 4.3.0)
#>  timechange    0.3.0   2024-01-18 [1] CRAN (R 4.3.1)
#>  tzdb          0.4.0   2023-05-12 [1] CRAN (R 4.3.0)
#>  utf8          1.2.4   2023-10-22 [1] CRAN (R 4.3.1)
#>  vctrs         0.6.5   2023-12-01 [1] CRAN (R 4.3.1)
#>  withr         3.0.0   2024-01-16 [1] CRAN (R 4.3.1)
#>  xfun          0.42    2024-02-08 [1] CRAN (R 4.3.1)
#>  yaml          2.3.8   2023-12-11 [1] CRAN (R 4.3.1)
#> 
#>  [1] /Users/nick/Library/R/arm64/4.3/library
#>  [2] /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/library
#> 
#> ──────────────────────────────────────────────────────────────────────────────
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment