具有多个条件的 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
因为这是你想在分析中做的步骤之一所以我保留它)
在 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
因为这是你想在分析中做的步骤之一所以我保留它)