Tables.jl icon indicating copy to clipboard operation
Tables.jl copied to clipboard

`Tables.dictcolumntable` produces columns with `#undef` instead of `missing` in struct-valued columns

Open kleinschmidt opened this issue 1 year ago • 1 comments

julia> using Tables

julia> struct SSS
           stuff
       end

julia> Tables.dictcolumntable([(; a=SSS(1)), (; b=2)]).a
2-element Vector{Union{Missing, SSS}}:
    SSS(1)
 #undef

julia> Tables.columns(Tables.dictrowtable([(; a=SSS(1)), (; b=2)]))
Tables.CopiedColumns{NamedTuple{(:a, :b), Tuple{Vector{Union{Missing, SSS}}, Vector{Union{Missing, Int64}}}}} with 2 rows, 2 columns, and schema:
 :a  Union{Missing, SSS}
 :b  Union{Missing, Int64}

julia> Tables.columns(Tables.dictrowtable([(; a=SSS(1)), (; b=2)])).a
2-element Vector{Union{Missing, SSS}}:
 SSS(1)
 missing

julia> Tables.dictcolumntable([(; a=1), (; b=2)]).a
2-element Vector{Union{Missing, Int64}}:
 1
  missing

kleinschmidt avatar Aug 01 '22 16:08 kleinschmidt

Looks like dictcolumntable assumes that missing is used instead of #undef, but that's only the case for bitstypes. And even worse, singleton types may be used as the default instead of missing, giving misleading results. So better initialize all the time the entry with missing.

nalimilan avatar Aug 02 '22 10:08 nalimilan

Sorry for the slow response: https://github.com/JuliaData/Tables.jl/pull/288

quinnj avatar Aug 28 '22 01:08 quinnj