Search code examples
rdplyrtidyversetibble

Extract portion of nested tibbles?


I've got a pile of nested tibbles that are from the tidyrss package. The data looks like this:

enter image description here

What I'm trying to do is take the four common items from each tibble and tidy them, so that the output looks like this:

item_title item_link item_description item_pub_date
title from article 1 some url longer text posix date
title from article 2 some url longer text posix date
title from article 3 some url longer text posix date
title from article 4 some url longer text posix date

Thus far I've tried unlist() and deframe() and both of those just make a general mess of things - and an added twist is not all the list items are tibbles. Some are functions, and I want to ignore those. What's the best tidyverse approach to tackle this task?


Solution

  • map_dfr seems to do what you want! It loops over a list and applies a function to each one - in this case, the only "function" we want to apply is returning the data frame/tibble, but that also allows us to skip the functions:

    clean_feed_df <- list(
      data.frame(item_title=sample(letters, 3), 
                 item_link=sample(letters, 3),
                 item_desc=sample(letters, 3),
                 item_date=sample(letters, 3)),
      data.frame(item_title=as.character(sample(1:100, 5)), 
                 item_link=as.character(sample(1:100, 5)),
                 item_desc=as.character(sample(1:100, 5)),
                 item_date=as.character(sample(1:100, 5))),
      function(x)sum(x)
    )
    
    map_dfr(clean_feed_df, function(rssentry){
      if(is(rssentry, "data.frame")){
        return(rssentry)
      }
    })
    

    which returns

      item_title item_link item_desc item_date
    1          s         s         u         i
    2          x         d         o         x
    3          t         x         d         h
    4         40        51        21        91
    5          4        25        37        34
    6          5        44        18        71
    7         65        70        83        90
    8         32        85        76        89