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)
原因是运算符优先级(与 DataFramesMeta.jl 无关)。
\n看:
\njulia> 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\nRun Code Online (Sandbox Code Playgroud)\n正如你所看到的,它2 > 1 | 3 > 4被解析为:2 > (1 | 3) > 4这不是你想要的。
但是,我建议您针对您的情况使用以下语法:
\njulia> @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\nRun Code Online (Sandbox Code Playgroud)\n或者
\njulia> @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\nRun Code Online (Sandbox Code Playgroud)\n我个人更喜欢,coalesce但这是一个品味问题。
请注意,||与 不需要括号相反|,但您需要反转条件的顺序才能利用短路行为,就||好像反转条件一样,您会收到错误:
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\nRun Code Online (Sandbox Code Playgroud)\n最后,@rsubset这可以是:
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\nRun Code Online (Sandbox Code Playgroud)\n(我假设您想要,@chain因为这是您想要在分析中执行的步骤之一,所以我保留它)