Julia 具有多个条件的子集数据框

Lob*_*shi 3 julia dataframesmeta.jl

在 中DataFramesMeta,为什么我应该将每个条件括在一对括号内?下面是一个示例数据帧,其中我想要一个包含大于 1 或 is 的值的子集missing

d = DataFrame(a = [1, 2, missing], b = ["x", "y", missing]);
Run Code Online (Sandbox Code Playgroud)

使用 DataFramesMeta 进行子集化:

@chain d begin
    @subset @byrow begin
        (:a > 1) | (:a===missing) 
    end
end
Run Code Online (Sandbox Code Playgroud)

如果我不使用括号,则会弹出错误。

@chain d begin
    @subset @byrow begin
        :a > 1 | :a===missing 
    end
end
# ERROR: LoadError: TypeError: non-boolean (Missing) used in boolean context
Run Code Online (Sandbox Code Playgroud)

Bog*_*ski 5

原因是运算符优先级(与 DataFramesMeta.jl 无关)。

\n

看:

\n
julia> dump(:(2 > 1 | 3 > 4))\nExpr\n  head: Symbol comparison\n  args: Array{Any}((5,))\n    1: Int64 2\n    2: Symbol >\n    3: Expr\n      head: Symbol call\n      args: Array{Any}((3,))\n        1: Symbol |\n        2: Int64 1\n        3: Int64 3\n    4: Symbol >\n    5: Int64 4\n
Run Code Online (Sandbox Code Playgroud)\n

正如你所看到的,它2 > 1 | 3 > 4被解析为:2 > (1 | 3) > 4这不是你想要的。

\n

但是,我建议您针对您的情况使用以下语法:

\n
julia> @chain d begin\n           @subset @byrow begin\n               coalesce(:a > 1, true)\n           end\n       end\n2\xc3\x972 DataFrame\n Row \xe2\x94\x82 a        b\n     \xe2\x94\x82 Int64?   String?\n\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n   1 \xe2\x94\x82       2  y\n   2 \xe2\x94\x82 missing  missing\n
Run Code Online (Sandbox Code Playgroud)\n

或者

\n
julia> @chain d begin\n           @subset @byrow begin\n               ismissing(:a) || :a > 1\n           end\n       end\n2\xc3\x972 DataFrame\n Row \xe2\x94\x82 a        b\n     \xe2\x94\x82 Int64?   String?\n\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n   1 \xe2\x94\x82       2  y\n   2 \xe2\x94\x82 missing  missing\n
Run Code Online (Sandbox Code Playgroud)\n

我个人更喜欢,coalesce但这是一个品味问题。

\n

请注意,||与 不需要括号相反|,但您需要反转条件的顺序才能利用短路行为,就||好像反转条件一样,您会收到错误:

\n
julia> @chain d begin\n           @subset @byrow begin\n               :a > 1 || ismissing(:a)\n           end\n       end\nERROR: TypeError: non-boolean (Missing) used in boolean context\n
Run Code Online (Sandbox Code Playgroud)\n

最后,@rsubset这可以是:

\n
julia> @chain d begin\n           @rsubset coalesce(:a > 1, true)\n       end\n2\xc3\x972 DataFrame\n Row \xe2\x94\x82 a        b\n     \xe2\x94\x82 Int64?   String?\n\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n   1 \xe2\x94\x82       2  y\n   2 \xe2\x94\x82 missing  missing\n
Run Code Online (Sandbox Code Playgroud)\n

(我假设您想要,@chain因为这是您想要在分析中执行的步骤之一,所以我保留它)

\n