检查变量的值是否属于set bootstrap

时间:2017-07-09 15:55:01

标签: dataframe subset julia bootstrap-4 any

我有一个整数数组

theIndex = [ 1 2 6 7 17 2]

我有一个数据框,其中包含一个包含整数的列数据集[:id]

dataset = DataFrame(id=[ 1, 1, 2, 2, 3, 3, 3, 4, 4, 4])

我想选择数据集中属于索引的所有观察结果。如果它们在索引中出现两次(或更多),我想选择它们两次(或更多次)

目前,我这样做是愚蠢的。

theIndex = [ 1 2 6 7 17 2]
dataset = DataFrame(id=[ 1, 1, 2, 2, 3, 3, 3, 4, 4, 4])
dataset2 = DataFrame(id=Int64[])
for ii1=1:size(theIndex,2)
    for ii2=1:size(dataset[:id],1)
        any(i->i.==dataset[ii2,:id],theIndex[ii1]) ? 
        push!(dataset2,dataset[ii2,:id]) : nothing
    end
end

更优雅的解决方案?

2 个答案:

答案 0 :(得分:1)

根据我之前的评论,您正在寻找findin功能。

julia> Ind = findin( dataset[:id], theIndex); # return indices of elements in
                                              # dataset[:id] that occur in
                                              # theIndex

julia> dataset[:id][Ind]
4-element DataArrays.DataArray{Int64,1}:
 1
 1
 2
 2

(或者如果您希望将结果以SubDataFrame / view的形式返回到数据集中,则可以执行SubDataFrame(dataset, Ind)等)

编辑根据评论,为了确保theIndex中的重复被考虑在内,每个元素的样本需要单独附加:

Ind = []; for i in theIndex; append!(Ind, findin(dataset[:id], i)); end
然后可以使用

Ind创建一个数组或SubDataFrame,如上所述。

编辑2

julia> @time dataset2 = DataFrame(id=Int64[])
       for ii1=1:size(theIndex,2)
           for ii2=1:size(dataset[:id],1)
               any(i->i.==dataset[ii2,:id],theIndex[ii1]) && 
               push!(dataset2,dataset[ii2,:id])
           end
       end
  0.000016 seconds (24 allocations: 1.594 KiB)

julia> @time Ind = []; for i in theIndex; append!(Ind, findin(dataset[:id], i)); end
  0.000002 seconds (5 allocations: 240 bytes)

(关于全球范围内基准测试的常见警示咆哮)

答案 1 :(得分:1)

基本上,问题是要计算theIndexdataset之间的SQL JOIN。遗憾的是,DataFrames并未在内部完全实现此功能。因此,为此目的,这是一个快速(和有效)的JOIN模拟:

using DataStructures

sort!(dataset, cols=:id]
j = 1
newvec = Vector{Int}() 
for (val,cnt) in SortedDict(countmap(theIndex))
    while j<=nrow(dataset)
        dataset[j,:id] > val && break
        dataset[j,:id] == val && append!(newvec,fill(j,cnt))
        j += 1
    end
end
dataset2 = dataset[newvec,:]

DataStructures包用于SortedDict。这种实现应该比其他多循环方法更有效。