Julia Dataframes - 使用 eltype Union{Missing, T} 简洁地创建列

Julia Dataframes - concisely create column with eltype Union{Missing, T}

我正在构建一个数据框,其中对于某些列,创建它们的明显方法涉及一个多步骤过程。我想用 eltype Union{Missing, T} 简洁地惯用地创建一个列。然后我可以使用多步骤流程填充该列(并在适当的时候禁止遗漏)。最干净的方法是什么?

我想做类似 df[!, :col] :: Vector{Union{Int64, Missing}} .= missing 的事情,但这给出了 "ArgumentError: column name :col not found in the data frame; ..."

如果我尝试 df[!, :col] .= fill(missing, nrow(df)) :: Vector{Union{Int64, Missing}},我会得到 "TypeError: in typeassert, expected Vector{Union{Missing, Int64}}, got a value of type Vector{Missing}"

目前我正在做一些丑陋和令人困惑的事情,比如

df[!, :col] .= 0

allowmissing!(df, :col)

df.col .= missing

有什么建议吗?我的感觉是,如果我有这个问题,我并不真正理解在 DataFrames.jl 中输入列的工作原理的细微差别,即使我一直使用它并且通常没有问题。我已经搜索了文档,但我觉得我没有看到任何有助于解决这个特定问题的内容,但是任何推荐的阅读材料都将不胜感激。

谢谢!

这是一种方法(还有其他选项可以将列添加到数据框,但要使用的关键函数是 missings):

julia> using DataFrames

julia> df = DataFrame()
0×0 DataFrame

julia> df.col = missings(Int, 5)
5-element Vector{Union{Missing, Int64}}:
 missing
 missing
 missing
 missing
 missing

julia> df
5×1 DataFrame
 Row │ col
     │ Int64?
─────┼─────────
   1 │ missing
   2 │ missing
   3 │ missing
   4 │ missing
   5 │ missing

julia> df.other_col = missings(Float64, nrow(df))
5-element Vector{Union{Missing, Float64}}:
 missing
 missing
 missing
 missing
 missing

julia> df
5×2 DataFrame
 Row │ col      other_col
     │ Int64?   Float64?
─────┼────────────────────
   1 │ missing    missing
   2 │ missing    missing
   3 │ missing    missing
   4 │ missing    missing
   5 │ missing    missing

附带说明 - 此问题与 DataFrames.jl 无关,但与 Julia 中向量的一般创建方式有关。 missings 函数在 Missings.jl 包中定义(由 DataFrames.jl 重新导出)。如果您只想使用 Julia Base 功能,那么以下内容与使用 missings 相同:

julia> Vector{Union{Int, Missing}}(missing, 5)
5-element Vector{Union{Missing, Int64}}:
 missing
 missing
 missing
 missing
 missing

(但是,因为它更冗长,我通常使用 missings 函数)