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

标签 julia dataframesmeta.jl

DataFramesMeta 中,为什么我应该将每个条件都包含在一对括号中?下面是一个示例数据框,我想要一个包含大于 1 的值或 缺失 的子集。

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,因为这是您要在分析中执行的步骤之一,所以我保留了它)

关于具有多个条件的 Julia 子集数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70845261/

相关文章:

function - 如何在 julia 中的其他函数中使用函数中的表达式

python - Julia 球谐函数与 python 不同

excel - 你能从 excel 宏运行 .jl 文件吗

timer - 如何每 15 分钟重复一次自定义函数? ( Julia )

julia - 当使用符号 ("x") 表达式从 DataFrame 中进行 @select 时,DataFramesMeta.js 中的表达式格式错误

Julia:从表达式创建 DataFrame 列?

julia - 使用 Julia Plots.jl 的热图和直方图的比例范围和比例字体

dataframe - 使用 DataFramesMeta 包中的 @linq 整理 Julia 中的数据

r - 为什么我在 Julia 中使用 dropmissing 或 skipmissing 会得到不同的结果?