Dataframe 将符号参数传递给@where,以便使用Julia选择数据帧的行
我想根据其中一列的值创建dataframe的子样本 如前一个问题所述(请参阅/questions/58220143/julia-dataframe-select-rows-based-values-of-one-column-behing-to-a-set),我可以使用以下语法: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]
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