如何在Julia Tidier的@group_by宏中使用符号向量分组?
解决Tidier.jl中符号向量作为分组列的问题
错误原因
你遇到的“列名:groupvars未找到”错误,是因为@group_by宏会直接把传入的groupvars当作列名符号处理,而不会解析这个变量内部存储的符号向量,所以它会去寻找名为:groupvars的列,自然找不到。
解决方法
你不需要把符号转成字符串,只需要把符号向量展开成宏可识别的单个列名参数,有两种常用方式:
方式1:使用!!! splatting操作符(推荐)
Tidier.jl原生支持用!!!展开符号/字符串向量,直接作为宏的列名参数:
groupvars = [:category, :sub_category, :region] df_sub = @chain df begin Tidier.@group_by(!!!groupvars) Tidier.@mutate(sales = sum(sales), profit = sum(profit), cogs = sum(cogs), discount = sum(discount), gross_profit = sum(gross_profit)) end
方式2:使用宏插值$配合...展开
利用Julia的宏插值语法,把向量元素逐个展开:
groupvars = [:category, :sub_category, :region] df_sub = @chain df begin Tidier.@group_by($(groupvars...)...) Tidier.@mutate(sales = sum(sales), profit = sum(profit), cogs = sum(cogs), discount = sum(discount), gross_profit = sum(gross_profit)) end
两种方式本质都是把[:a, :b, :c]转换成:a, :b, :c的形式传递给@group_by,让宏正确识别分组列。
内容的提问来源于stack exchange,提问作者rwdvc
相关产品推荐
相关产品推荐

