-
Notifications
You must be signed in to change notification settings - Fork 15
/
pivots.jl
61 lines (54 loc) · 1.89 KB
/
pivots.jl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
"""
$docstring_pivot_wider
"""
macro pivot_wider(df, exprs...)
# take the expressions and return arg => value dictionary
tidy_exprs = parse_interpolation.(exprs)
tidy_exprs = parse_pivot_args.(tidy_exprs)
expr_dict = Dict(x.args[2] => x.args[3] for x in tidy_exprs)
df_expr = quote
unstack(DataFrame($(esc(df))),
$(expr_dict[QuoteNode(:names_from)]),
$(expr_dict[QuoteNode(:values_from)]))
end
if code[]
@info MacroTools.prettify(df_expr)
end
return(df_expr)
end
"""
$docstring_pivot_longer
"""
macro pivot_longer(df, exprs...)
tidy_exprs = parse_interpolation.(exprs)
tidy_exprs = parse_pivot_args.(tidy_exprs)
expr_dict = Dict(x.args[2] => x.args[3] for x in tidy_exprs)
if !haskey(expr_dict, QuoteNode(:(names_to))) && !haskey(expr_dict, QuoteNode(:(values_to)))
df_expr = quote
stack(DataFrame($(esc(df))), $(expr_dict[QuoteNode(:cols)]))
end
elseif (haskey(expr_dict, QuoteNode(:(names_to))) && haskey(expr_dict, QuoteNode(:(values_to))))
df_expr = quote
stack(DataFrame($(esc(df))),
$(expr_dict[QuoteNode(:cols)]),
variable_name = $(expr_dict[QuoteNode(:names_to)]),
value_name = $(expr_dict[QuoteNode(:values_to)]))
end
elseif haskey(expr_dict, QuoteNode(:(names_to)))
df_expr = quote
stack(DataFrame($(esc(df))),
$(expr_dict[QuoteNode(:cols)]),
variable_name = $(expr_dict[QuoteNode(:names_to)]))
end
elseif haskey(expr_dict, QuoteNode(:(values_to)))
df_expr = quote
stack(DataFrame($(esc(df))),
$(expr_dict[QuoteNode(:cols)]),
value_name = $(expr_dict[QuoteNode(:values_to)]))
end
end
if code[]
@info MacroTools.prettify(df_expr)
end
return df_expr
end