Giora Simchoni
Giora Simchoni

Reputation: 3689

How to separate a column list of fixed size X to X different columns?

I have a tibble with one column being a list column, always having two numeric values named a and b (e.g. as a result of calling purrr:map to a function which returns a list), say:

df <- tibble(x = 1:3, y = list(list(a = 1, b = 2), list(a = 3, b = 4), list(a = 5, b = 6)))
df
# A tibble: 3 × 2
  x          y
 <int>     <list>
1     1 <list [2]>
2     2 <list [2]>
3     3 <list [2]>

How do I separate the list column y into two columns a and b, and get:

df_res <- tibble(x = 1:3, a = c(1,3,5), b = c(2,4,6))
df_res
# A tibble: 3 × 3
  x     a     b
 <int> <dbl> <dbl>
1     1     1     2
2     2     3     4
3     3     5     6

Looking for something like tidyr::separate to deal with a list instead of a string.

Upvotes: 0

Views: 51

Answers (2)

mt1022
mt1022

Reputation: 17289

Using dplyr (current release: 0.7.0):

bind_cols(df[1], bind_rows(df$y))
# # A tibble: 3 x 3
#       x     a     b
#   <int> <dbl> <dbl>
# 1     1     1     2
# 2     2     3     4
# 3     3     5     6

edit based on OP's comment:

To embed this in a pipe and in case you have many non-list columns, we can try:

df %>% select(-y) %>% bind_cols(bind_rows(df$y))

Upvotes: 2

akrun
akrun

Reputation: 886938

We could also make use the map_df from purrr

library(tidyverse)
df %>% 
  summarise(x = list(x), new = list(map_df(.$y, bind_rows))) %>%
  unnest
# A tibble: 3 x 3
#      x     a     b
#   <int> <dbl> <dbl>
#1     1     1     2
#2     2     3     4
#3     3     5     6

Upvotes: 1

Related Questions