Skip to content

Commit c9b1c5f

Browse files
authored
Rename: Add support for modification function (#267)
* Rename: Add support for modification function * Update compat
1 parent 0fca756 commit c9b1c5f

File tree

3 files changed

+30
-10
lines changed

3 files changed

+30
-10
lines changed

src/transforms/rename.jl

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,12 @@
66
Rename(:col₁ => :newcol₁, :col₂ => :newcol₂, ..., :colₙ => :newcolₙ)
77
Rename([:col₁ => :newcol₁, :col₂ => :newcol₂, ..., :colₙ => :newcolₙ])
88
9-
The transform that renames `col₁`, `col₂`, ..., `colₙ`
10-
to `newcol₁`, `newcol₂`, ..., `newcolₙ`.
9+
Renames the columns `col₁`, `col₂`, ..., `colₙ` to `newcol₁`, `newcol₂`, ..., `newcolₙ`.
10+
11+
Rename(fun)
12+
13+
Renames the table columns using the modification function `fun` that takes a
14+
string as input and returns another string with the new name.
1115
1216
# Examples
1317
@@ -18,17 +22,22 @@ Rename("a" => "x", "c" => "y")
1822
Rename([1 => "x", 3 => "y"])
1923
Rename([:a => "x", :c => "y"])
2024
Rename(["a", "c"] .=> [:x, :y])
25+
Rename(nm -> nm * "_suffix")
2126
```
2227
"""
23-
struct Rename{S<:ColumnSelector} <: StatelessFeatureTransform
28+
struct Rename{S<:ColumnSelector,N} <: StatelessFeatureTransform
2429
selector::S
25-
newnames::Vector{Symbol}
26-
function Rename(selector::S, newnames) where {S<:ColumnSelector}
27-
_assert(allunique(newnames), "new names must be unique")
28-
new{S}(selector, newnames)
30+
newnames::N
31+
function Rename(selector::S, newnames::N) where {S<:ColumnSelector,N}
32+
if newnames isa AbstractVector
33+
_assert(allunique(newnames), "new names must be unique")
34+
end
35+
new{S,N}(selector, newnames)
2936
end
3037
end
3138

39+
Rename(fun) = Rename(AllSelector(), fun)
40+
3241
Rename(pairs::Pair{C,Symbol}...) where {C<:Column} = Rename(selector(first.(pairs)), collect(last.(pairs)))
3342

3443
Rename(pairs::Pair{C,S}...) where {C<:Column,S<:AbstractString} =
@@ -41,13 +50,17 @@ Rename(pairs::AbstractVector{Pair{C,S}}) where {C<:Column,S<:AbstractString} =
4150

4251
isrevertible(::Type{<:Rename}) = true
4352

53+
_newnames(newnames::AbstractVector{Symbol}, snames) = newnames
54+
_newnames(fun, snames) = [Symbol(fun(string(name))) for name in snames]
55+
4456
function applyfeat(transform::Rename, feat, prep)
4557
cols = Tables.columns(feat)
4658
names = Tables.columnnames(cols)
4759
snames = transform.selector(names)
48-
_assert(transform.newnames setdiff(names, snames), "duplicate names")
60+
tnames = _newnames(transform.newnames, snames)
61+
_assert(tnames setdiff(names, snames), "duplicate names")
4962

50-
mapnames = Dict(zip(snames, transform.newnames))
63+
mapnames = Dict(zip(snames, tnames))
5164
newnames = [get(mapnames, nm, nm) for nm in names]
5265
columns = [Tables.getcolumn(cols, nm) for nm in names]
5366

test/Project.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,5 @@ TypedTables = "9d95f2ec-7b3d-5a63-8d20-e2491e220bb9"
1919
Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d"
2020

2121
[compat]
22-
PairPlots = "2.1"
22+
CairoMakie = "=0.11.6"
23+
PairPlots = "=2.3.1"

test/transforms/rename.jl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,12 @@
146146
tₒ = revert(T, n, c)
147147
@test t == tₒ
148148

149+
T = Rename(nm -> nm * "_test")
150+
n, c = apply(T, t)
151+
@test Tables.schema(n).names == (:a_test, :b_test, :c_test, :d_test)
152+
tₒ = revert(T, n, c)
153+
@test t == tₒ
154+
149155
# throws
150156
@test_throws AssertionError Rename(:a => :x, :b => :x)
151157
@test_throws AssertionError apply(Rename(:a => :c, :b => :d), t)

0 commit comments

Comments
 (0)