Search code examples
rdataframetidyrunnest

Unnest a data frame and fill new rows with NAs


Let's say I have a nested df, and I want to unnest the columns:

df <- tibble::tribble(
    ~x, ~y, ~nestdf,
    1,  2,  tibble::tibble(a=1:2, b=3:4),
    3,  4,  tibble::tibble(a=3:5, b=5:7)
)
tidyr::unnest(df, nestdf)

#      x     y     a     b
#  <dbl> <dbl> <int> <int>
#1     1     2     1     3
#2     1     2     2     4
#3     3     4     3     5
#4     3     4     4     6
#5     3     4     5     7

The result has the x and y columns extended to match the dimensions of nestdf, with the new rows using the existing values. However, I want the new rows to contain NA, like so:

#      x     y     a     b
#  <dbl> <dbl> <int> <int>
#1     1     2     1     3
#2    NA    NA     2     4
#3     3     4     3     5
#4    NA    NA     4     6
#5    NA    NA     5     7

Is it possible to do this with unnest? Either the first or last row for each group can be kept as non-NA, I don't mind.


Solution

  • Repeating rows, and binding with an unnest of the nested list column(s):

    nr <- sapply(df$nestdf, nrow) - 1
    cbind(
      df[rep(rbind(seq_along(nr), NA), rbind(1, nr)), c("x","y")],
      unnest(df["nestdf"], cols=everything())
    )
    
    #   x  y a b
    #1  1  2 1 3
    #2 NA NA 2 4
    #3  3  4 3 5
    #4 NA NA 4 6
    #5 NA NA 5 7