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

Julia subsetting dataframe with multiple conditions

DataFramesMeta 中,为什么我要把每个条件都用一对括号括起来?下面是一个示例数据框,我想要一个包含大于 1 或 missing.

的值的子集
d = DataFrame(a = [1, 2, missing], b = ["x", "y", missing]);

使用 DataFramesMeta 进行子集化:

@chain d begin
    @subset @byrow begin
        (:a > 1) | (:a===missing) 
    end
end

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

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

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

参见:

julia> dump(:(2 > 1 | 3 > 4))
Expr
  head: Symbol comparison
  args: Array{Any}((5,))
    1: Int64 2
    2: Symbol >
    3: Expr
      head: Symbol call
      args: Array{Any}((3,))
        1: Symbol |
        2: Int64 1
        3: Int64 3
    4: Symbol >
    5: Int64 4

如您所见,2 > 1 | 3 > 4 被解析为:2 > (1 | 3) > 4 这不是您想要的。

但是,我会针对您的情况推荐以下语法:

julia> @chain d begin
           @subset @byrow begin
               coalesce(:a > 1, true)
           end
       end
2×2 DataFrame
 Row │ a        b
     │ Int64?   String?
─────┼──────────────────
   1 │       2  y
   2 │ missing  missing

julia> @chain d begin
           @subset @byrow begin
               ismissing(:a) || :a > 1
           end
       end
2×2 DataFrame
 Row │ a        b
     │ Int64?   String?
─────┼──────────────────
   1 │       2  y
   2 │ missing  missing

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

请注意,与 | 相反,|| 不需要括号,但您需要颠倒条件的顺序以利用 || 的短路行为,就好像你扭转了你会得到一个错误的条件:

julia> @chain d begin
           @subset @byrow begin
               :a > 1 || ismissing(:a)
           end
       end
ERROR: TypeError: non-boolean (Missing) used in boolean context

最后 @rsubset 这可以是:

julia> @chain d begin
           @rsubset coalesce(:a > 1, true)
       end
2×2 DataFrame
 Row │ a        b
     │ Int64?   String?
─────┼──────────────────
   1 │       2  y
   2 │ missing  missing

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