Skip to content

Commit 3e5a1ee

Browse files
committed
support of deleteat! for subdatasets
1 parent 697b88b commit 3e5a1ee

File tree

5 files changed

+51
-15
lines changed

5 files changed

+51
-15
lines changed

src/dataset/del_and_append.jl

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ julia> deleteat!(ds, 2)
2727
```
2828
2929
"""
30-
function Base.deleteat!(ds::Dataset, inds)
30+
function Base.deleteat!(ds::AbstractDataset, inds)
3131

3232
# Modify Dataset
3333
if !isempty(inds) && size(ds, 2) == 0
@@ -40,7 +40,7 @@ function Base.deleteat!(ds::Dataset, inds)
4040
end
4141

4242
# Modify Dataset
43-
function Base.deleteat!(ds::Dataset, inds::AbstractVector{Bool})
43+
function Base.deleteat!(ds::AbstractDataset, inds::AbstractVector{Bool})
4444
if length(inds) != size(ds, 1)
4545
throw(BoundsError(ds, (inds, :)))
4646
end
@@ -49,13 +49,16 @@ function Base.deleteat!(ds::Dataset, inds::AbstractVector{Bool})
4949
end
5050

5151
# Modify Dataset
52-
Base.deleteat!(ds::Dataset, inds::Not) = deleteat!(ds, axes(ds, 1)[inds])
52+
Base.deleteat!(ds::AbstractDataset, inds::Not) = deleteat!(ds, axes(ds, 1)[inds])
5353

5454
# Modify Dataset
55-
function _delete!_helper(ds::Dataset, drop)
55+
function _delete!_helper(ds::AbstractDataset, drop)
5656
cols = _columns(ds)
5757
isempty(cols) && return ds
58-
58+
if ds isa SubDataset
59+
deleteat!(getfield(ds, :rows), drop)
60+
return ds
61+
end
5962
n = nrow(ds)
6063
col1 = cols[1]
6164
deleteat!(col1, drop)

src/subdataset/subdataset.jl

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -110,8 +110,14 @@ Base.@propagate_inbounds function SubDataset(parent::Dataset, rows::AbstractVect
110110
end
111111
SubDataset(parent, SubIndex(index(parent), cols), rows)
112112
end
113+
Base.@propagate_inbounds function SubDataset(parent::Dataset, rows::AbstractUnitRange, cols)
114+
@boundscheck if !checkindex(Bool, axes(parent, 1), rows)
115+
throw(BoundsError(parent, (rows, cols)))
116+
end
117+
SubDataset(parent, SubIndex(index(parent), cols), convert(Vector{Int}, rows))
118+
end
113119
Base.@propagate_inbounds SubDataset(parent::Dataset, ::Colon, cols) =
114-
SubDataset(parent, axes(parent, 1), cols)
120+
SubDataset(parent, collect(axes(parent, 1)), cols)
115121
@inline SubDataset(parent::Dataset, row::Integer, cols) =
116122
throw(ArgumentError("invalid row index: $row of type $(typeof(row))"))
117123

@@ -275,8 +281,8 @@ Base.setproperty!(::SubDataset, ::AbstractString, ::Any) =
275281

276282
Base.copy(sds::SubDataset) = parent(sds)[rows(sds), parentcols(index(sds), :)]
277283

278-
Base.deleteat!(ds::SubDataset, ind) =
279-
throw(ArgumentError("SubDataset does not support deleting rows"))
284+
# Base.deleteat!(ds::SubDataset, ind) =
285+
# throw(ArgumentError("SubDataset does not support deleting rows"))
280286

281287
function Dataset(sds::SubDataset)
282288

test/data.jl

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,13 @@ using Test, InMemoryDatasets, Random, CategoricalArrays
117117
ds2 = ds[nrow(ds):-1:1, ncol(ds):-1:1]
118118
@test unique(ds2, cols, keep = keepval, mapformats = mfmt) == unique(view(ds, nrow(ds):-1:1, ncol(ds):-1:1), cols, keep = keepval, mapformats = mfmt)
119119
end
120+
121+
ds1 = Dataset(a = Union{String, Missing}["a", "b", "a", "b", "a", "b"],
122+
b = Vector{Union{Int, Missing}}(1:6),
123+
c = Union{Int, Missing}[1:3;1:3])
124+
ds = vcat(ds1, ds1)
125+
unique!(ds, 1, keep = :random)
126+
@test ds == unique(ds, 1)
120127
end
121128

122129
@testset "completecases and dropmissing" begin

test/sort.jl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -399,6 +399,10 @@ end
399399
sds = view(ds, [true, true, true, true, true, false, false, false, false, false], 1:2)
400400
sort!(sds, 1)
401401
@test sds == sort(sds, 1)
402+
403+
sds = view(ds, 1:5, 1:2)
404+
sort!(sds, 1)
405+
@test sds == sort(sds, 1)
402406
end
403407

404408
@testset "issorted/issorted!" begin

test/subdataset.jl

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -222,12 +222,6 @@ end
222222
@test names(ds) == names(x)[[4, 2]]
223223
end
224224

225-
@testset "deleteat!" begin
226-
y = 1.0:10.0
227-
ds = view(Dataset(y=y), 2:6, :)
228-
@test_throws ArgumentError deleteat!(ds, 1)
229-
end
230-
231225
@testset "parent" begin
232226
ds = Dataset(a=Union{Int, Missing}[1, 2, 3, 1, 2, 2],
233227
b=[2.0, missing, 1.2, 2.0, missing, missing],
@@ -293,7 +287,29 @@ end
293287
if VERSION >= v"1.7.0-DEV"
294288
@test_throws ArgumentError SubDataset(sds, Integer[true, true, true], :)
295289
else
296-
@test SubDataset(sds, Integer[true, true, true], :) ==
290+
@test SubDataset(sds, Int[true, true, true], :) ==
297291
SubDataset(sds, [1, 1, 1], :)
298292
end
299293
end
294+
295+
@testset "deletat! for views" begin
296+
ds1 = Dataset(a = Union{String, Missing}["a", "b", "a", "b", "a", "b"],
297+
b = Vector{Union{Int, Missing}}(1:6),
298+
c = Union{Int, Missing}[1:3;1:3])
299+
ds = vcat(ds1, ds1)
300+
sds = view(ds, 1:4, [1,3])
301+
deleteat!(sds, 1)
302+
@test sds == ds[2:4, [1,3]]
303+
sds = view(ds, 1:4, [1,3])
304+
deleteat!(sds, 1:2)
305+
@test sds == ds[3:4, [1,3]]
306+
sds = view(ds, 1:4, [1,3])
307+
deleteat!(sds, [1,3])
308+
@test sds == ds[[2,4], [1,3]]
309+
sds = view(ds, :, :)
310+
deleteat!(sds, Not(1:3))
311+
@test sds == ds[1:3, :]
312+
sds = view(ds, :, :)
313+
deleteat!(sds, [1,3,5,7,9,11])
314+
@test sds == ds[[2,4,6,8,10,12], :]
315+
end

0 commit comments

Comments
 (0)