Search code examples
rdplyrtibble

Remove labels from within data.frame and tibble


I have used named vectors to make a data.frame. When I convert this data.frame to a tibble, I end up with named lists instead of regular columns. How can I remove these names?

example data

ww = structure(list(is_character = list(`labA` = 1, `labB` = 1, `labC` = 1), 
                    is_numeric = list(`labA` = 0, `labB` = 0, `labC` = 0),
                    is_logical = list(`labA` = 0, `labB` = 0, `labC` = 0),
                    column_name = c("labA", "labB", "labC")),
               row.names = c(NA, -3L), class = "data.frame")

Everything looks fine when viewed as a dataframe. as.data.frame(ww) returns the following:

  is_character is_numeric is_logical column_name
1            1          0          0        labA
2            1          0          0        labB
3            1          0          0        labC

But when converted to a tibble I end up with named lists instead of plain columns. as_tibble(ww) returns the following:

# A tibble: 3 x 4
  is_character is_numeric   is_logical   column_name
  <named list> <named list> <named list> <chr>      
1 <dbl [1]>    <dbl [1]>    <dbl [1]>    labA       
2 <dbl [1]>    <dbl [1]>    <dbl [1]>    labB       
3 <dbl [1]>    <dbl [1]>    <dbl [1]>    labC 

I don't want to work with named lists in my tibble, I want to work with plain numeric columns. How can I do this?

I have tried to make the original data.frame from unnamed lists, but this introduces other problems. So, removing the names is preferable. I have made several attempts with unname with no success.


Solution

  • There are a couple of simple approaches:

    as_tibble(ww) %>% mutate(across(everything(), unlist))
    

    Or

    as_tibble(ww) %>% unnest(everything())
    

    Both approaches produce:

      is_character is_numeric is_logical column_name
             <dbl>      <dbl>      <dbl> <chr>      
    1            1          0          0 labA       
    2            1          0          0 labB       
    3            1          0          0 labC  
    

    Of note, your is_character column is not character, and your is_logical column is not logical. However, if your input data was this:

    ww = structure(list(is_character = list(`labA` = "a", `labB` = "b", `labC` = "c"), 
                        is_numeric = list(`labA` = 0, `labB` = 0, `labC` = 0),
                        is_logical = list(`labA` = T, `labB` = F, `labC` = T),
                        column_name = c("labA", "labB", "labC")),
                   row.names = c(NA, -3L), class = "data.frame")
    

    then the above approaches would produce this:

    # A tibble: 3 x 4
      is_character is_numeric is_logical column_name
      <chr>             <dbl> <lgl>      <chr>      
    1 a                     0 TRUE       labA       
    2 b                     0 FALSE      labB       
    3 c                     0 TRUE       labC