MCP_infiltrator
MCP_infiltrator

Reputation: 4189

Mutate All columns in a list of tibbles

Lets suppose I have the following list of tibbles:

a_list_of_tibbles <- list(
  a = tibble(a = rnorm(10)),
  b = tibble(a = runif(10)), 
  c = tibble(a = letters[1:10])
)

Now I want to map them all into a single dataframe/tibble, which is not possible due to the differing column types.

How would I go about this?

I have tried this, but I want to get rid of the for loop

for(i in 1:length(a_list_of_tibbles)){
  a_list_of_tibbles[[i]] <- a_list_of_tibbles[[i]] %>% mutate_all(as.character)
}

Then I run:

map_dfr(.x = a_list_of_tibbles, .f = as_tibble)

Upvotes: 3

Views: 781

Answers (2)

jpdugo17
jpdugo17

Reputation: 7116

Another alternative is to use:

library(tidyverse)

map_depth(a_list_of_tibbles, 2, as.character) %>%
  bind_rows()
#> # A tibble: 30 × 1
#>    a                 
#>    <chr>             
#>  1 0.0894618169853206
#>  2 -1.50144637645091 
#>  3 1.44795821718513  
#>  4 0.0795342912030257
#>  5 -0.837985570593029
#>  6 -0.050845557103668
#>  7 0.031194556366589 
#>  8 0.0989551909839589
#>  9 1.87007290229274  
#> 10 0.67816212007413  
#> # … with 20 more rows

Created on 2021-12-20 by the reprex package (v2.0.1)

Upvotes: 1

akrun
akrun

Reputation: 887881

We could do the computation within the map - use across instead of the suffix _all (which is getting deprecated) to loop over the columns of the dataset

library(dplyr)
library(purrr)
map_dfr(a_list_of_tibbles, 
     ~.x %>%
       mutate(across(everything(), as.character) %>%
       as_tibble))

-output

# A tibble: 30 × 1
   a                 
   <chr>             
 1 0.735200825884485 
 2 1.4741501589461   
 3 1.39870958697574  
 4 -0.36046362308853 
 5 -0.893860999301402
 6 -0.565468636033674
 7 -0.075270267983768
 8 2.33534260196058  
 9 0.69667906338348  
10 1.54213170143702  
# … with 20 more rows

Upvotes: 2

Related Questions