Home > Net >  Convert list of named vectors of different length to tibble
Convert list of named vectors of different length to tibble

Time:11-05

I have the following list

example <- list(a = c(1, 2, 3),
                b = c(2, 3),
                c = c(3, 4, 5, 6))

that I'd like to transform into the following tibble

# A tibble: 9 × 2
  name  value
  <chr> <dbl>
1 a         1
2 a         2
3 a         3
4 b         2
5 b         3
6 c         3
7 c         4
8 c         5
9 c         6

I've found multiple StackOverflow questions on this subject like here, here or here, but none is adressing this particular case where the name of the vector is not expected to become a column name.

I managed to achieve the desired result with a good old loop like below, but I'm looking for a faster and more elegant way.

library(dplyr)

example_list <- list(a = c(1, 2, 3),
                     b = c(2, 3),
                     c = c(3, 4, 5, 6))

example_tibble <- tibble()

for (i in 1:length(example_list)) {
  example_tibble <- example_tibble %>% 
    bind_rows(as_tibble(example_list[[i]]) %>% 
                mutate(name = names(example_list)[[i]]))
}

example_tibble <- example_tibble %>% 
  relocate(name)

CodePudding user response:

Try stack

> stack(example)
  values ind
1      1   a
2      2   a
3      3   a
4      2   b
5      3   b
6      3   c
7      4   c
8      5   c
9      6   c

CodePudding user response:

example <- list(a = c(1, 2, 3),
                b = c(2, 3),
                c = c(3, 4, 5, 6))
library(tidyverse)
enframe(example) %>% 
  unnest(value)

#> # A tibble: 9 x 2
#>   name  value
#>   <chr> <dbl>
#> 1 a         1
#> 2 a         2
#> 3 a         3
#> 4 b         2
#> 5 b         3
#> 6 c         3
#> 7 c         4
#> 8 c         5
#> 9 c         6

Created on 2021-11-04 by the reprex package (v2.0.1)

  •  Tags:  
  • r
  • Related