Hmmmm, I'm now having second thoughts about supporting matrix and data frame columns, because it's not clear when they will be useful. I think I was getting confused with lists of data frames, which I can clearly see being used an as interim hierarchical form between normalised and unnormalised data. But data frame and matrix columns, just extend the columns in weird ways, and need a lot of special handling.
Data frames in particularly are problematic because the length of a data frame is the number of columns, where the length of a list-column is the number of rows.
cc @romainfrancois - I think this means we don't need special handling, and can happily throw an error if we see a data frame or matrix column. data_frame() will need a minor adjustment to use length() instead of NROW(). I'm not sure if we single them out for special handling errors as well.