Save a data frame with list-columns as csv file

Create a tibble containing list columns:

library(tibble)

clinic_name <- c('bobo center', 'yoyo plaza', 'lolo market')
drop_in_hours <- list(c("Monday: 2 pm - 5 pm", "Tuesday: 4 pm - 7 pm")) 
appointment_hours <- list(c("Monday: 1 pm - 2 pm", "Tuesday: 2 pm - 3 pm")) 
services <- list(c("skin graft", "chicken heart replacement"))

tibb <- data_frame(clinic_name, drop_in_hours, appointment_hours, services)

print(tibb)

enter image description here

Write a general-purpose function that converts any list columns to character type:

set_lists_to_chars <- function(x) {
    if(class(x) == 'list') {
    y <- paste(unlist(x[1]), sep='', collapse=', ')
    } else {
    y <- x 
    }
    return(y)
}

Apply function to tibble with list columns:

new_frame <- data.frame(lapply(tibb, set_lists_to_chars), stringsAsFactors = F)

new_frame

enter image description here

Write newly formatted dataframe as csv file:

write.csv(new_frame, file='Desktop/clinics.csv')

enter image description here

This is a csv file with the list columns expanded as regular strings.

Here is an all-encompassing function. Just pass in your tibble and a filename:

tibble_with_lists_to_csv <- function(tibble_object, file_path_name) {
    set_lists_to_chars <- function(x) { 
        if(class(x) == 'list') { y <- paste(unlist(x[1]), sep='', collapse=', ') } else { y <- x  } 
        return(y) }
    new_frame <- data.frame(lapply(tibble_object, set_lists_to_chars), stringsAsFactors = F)
    write.csv(new_frame, file=file_path_name)
}

Usage:

tibble_with_lists_to_csv(tibb, '~/Desktop/tibb.csv')

I had a similar dataframe with list columns that I wanted to save as csv. I figured out this method. As well as how to turn the columns back into lists.

library(tidyverse)

# create a df with a list column
df <- tibble(x=rep(1:5,each=2), y=LETTERS[1:10]) %>%
  group_by(x) %>%
  summarise(z=list(y))

# this throws an error
write_csv(df, "test.csv")

# convert the list column to a string
df2 <- df %>%
  group_by(x) %>% # where x==unique(x)
  mutate(z=paste(z))

# this works
write_csv(df2, "test.csv")

# read the csv
df3 <- read_csv("test.csv")

# reconstruct original df by parsing the strings
# https://stackoverflow.com/questions/1743698/evaluate-expression-given-as-a-string
df4 <- df3 %>%
  group_by(x) %>% 
  mutate(z=list(eval(parse(text=z))))