construct data frame from list