Dataframe 将符号参数传递给@where,以便使用Julia选择数据帧的行

Dataframe 将符号参数传递给@where,以便使用Julia选择数据帧的行,dataframe,julia,Dataframe,Julia,我想根据其中一列的值创建dataframe的子样本 如前一个问题所述(请参阅/questions/58220143/julia-dataframe-select-rows-based-values-of-one-column-behing-to-a-set),我可以使用以下语法: using DataFrames, DataFramesMeta DT = DataFrame(ID = [1, 1, 2,2,3,3, 4,4], x1 = rand(8)) @where(DT, in([1,4]

我想根据其中一列的值创建dataframe的子样本

如前一个问题所述(请参阅/questions/58220143/julia-dataframe-select-rows-based-values-of-one-column-behing-to-a-set),我可以使用以下语法:

using DataFrames, DataFramesMeta
DT = DataFrame(ID = [1, 1, 2,2,3,3, 4,4], x1 = rand(8))

@where(DT, in([1,4]).(:ID))
现在,如果我开发一个函数,让我们称之为subsampleDF,其中varID参数是对应于选择变量的符号

function subsampleDF( data::DataFrame, varID::Symbol,subs::Vector{Int})
    d = @where(data, in(subs).(varID))
end

subsampleDF(DT, :ID,  [1,4])
然后我得到以下错误。我不知道为什么它是错误的,因为varID实际上等于:ID

> ArgumentError: invalid row index of type Bool

Stacktrace:
 [1] Type at C:\Users\djourdain\.julia\packages\DataFrames\yH0f6\src\dataframerow\dataframerow.jl:60 [inlined]
 [2] getindex at C:\Users\djourdain\.julia\packages\DataFrames\yH0f6\src\dataframerow\dataframerow.jl:93 [inlined]
 [3] where(::DataFrame, ::getfield(Main, Symbol("##10#11")){Symbol,Array{Int64,1}}) at C:\Users\djourdain\.julia\packages\DataFramesMeta\c88dH\src\DataFramesMeta.jl:186
 [4] subsampleDF(::DataFrame, ::Symbol, ::Array{Int64,1}) at .\In[8]:2
 [5] top-level scope at In[9]:1
多谢各位


Damien不是对您的问题的直接回答(不确定
@where
宏发生了什么),但您可以只使用普通数据帧吗

using DataFrames
DT = DataFrame(ID = [1, 1, 2,2,3,3, 4,4], x1 = rand(8))

function subsampleDF( data::DataFrame, varID::Symbol,subs::Vector{Int})
    data[in(subs).(data[!, varID]), :]
end

subsampleDF(DT, :ID,  [1,4])

应按预期工作。

在DataFramesMeta.jl中,使用
cols
引用使用表达式的列。因此,定义函数的正确方法是:

function subsampleDF( data::DataFrame, varID::Symbol,subs::Vector{Int})
    @where(data, in(subs).(cols(varID)))
end