如标题所示,我有一个数据框,我想过滤(保留)其中
id
变量为 1
或 2
的行。
一个例子:
using DataFrames
# example data set
df1 = DataFrame(id = repeat(1:3, 3),
name = repeat(["bob", "jane", "steve"], inner = 3))
# filtering based on a single id - works fine
kp_id = 1
df1[df1.id .== 1, :]
# filter on multiple id's - my attempt returns an empty dataframe
kp_id = (1,2)
df1[df1.id .== in(df1.id, kp_id), :]
如有任何建议,我们将不胜感激。
归根结底是编写一个布尔表达式来生成所需的位向量。当您处理此问题时,请先跳过索引并继续处理
df1.id .== 1
那么 Julia 中一个有用的工具就是首先考虑单个案例:
julia> in(1, (1,2))
true
julia> in(3, (1,2))
false
到目前为止一切顺利!让我们广播这个,但只在第一个参数上,所以我们用 Ref 来保护第二个参数
julia> in.(df1.id, Ref((1,2)))
9-element BitVector:
1
1
0
1
1
0
1
1
0
因此
df1[in.(df1.id, Ref(kp_id)), :]
会起作用的。
您可能更喜欢
filter
函数,因为它更具可读性:
julia> filter(:id => in((1, 2)), df1)
6×2 DataFrame
Row │ id name
│ Int64 String
─────┼───────────────
1 │ 1 bob
2 │ 2 bob
3 │ 1 jane
4 │ 2 jane
5 │ 1 steve
6 │ 2 steve
如果你想使用索引,你可以写:
julia> df1[in((1, 2)).(df1.id), :]
6×2 DataFrame
Row │ id name
│ Int64 String
─────┼───────────────
1 │ 1 bob
2 │ 2 bob
3 │ 1 jane
4 │ 2 jane
5 │ 1 steve
6 │ 2 steve
这两种语法都利用了以下事实:
in((1, 2))
创建了一个新函数来检查其参数是否在(1, 2)
中。