求助: pivot@r 列转行 /concat 聚合时 nulls 的显示问题
集算器中列转行对应的功能是 pivot@r,在市面上其它语言中也叫逆透视 unpivot。比如有以下数据想实现列转行的操作,第一行属于表头:
A | B | C | D | E | |
1 | ID | Criteria1 | Criteria2 | Criteria3 | Criteria4 |
2 | 101 | 2 | |||
3 | 102 | 7 | |||
4 | 123 | 93 | |||
5 | 123 | 8 | |||
6 | 123 | 6 | |||
7 | 123 | 17 | |||
8 | 182 | 6 | |||
9 | 182 | 9 | |||
10 | 182 | 39 | |||
11 | 182 | 120 | |||
12 | 182 | 147 |
用 pivot@r 可以很简洁地实现列转行,比如在 Excel 插件中呈现的效果如下 (IDE 一样的效果):
观察发现,有空值 (真空 null) 的行也会一一对应显示,如上图中右侧带底纹处所示。如果不想要这些空值所在的行,需多写一步,用 select 过滤选出,如下:
这两种显示效果都可以,不能说哪种显示就一定更好,完全看当时的需求。
我想求助的是,在 pivot@r 时能否让用户自己选择显示空行或者不显示空行?
目前市面上能用 unpivot 的应用中,多数是默认不显示 null 值对应的行的,比如,在 Power Query 中 unpivot 之后显示的效果是这样的:
此时如果需要 null 值对应的行,那必须在 unpivot 之前处理一下 null 值,把 null 变成假空。
在某些 SQL 中,倒是会提供是否包含 nulls 的关键词,比如以下 SQL 默认是忽略 nulls 的:
如果要包含 nulls,要写上 unpivot include nulls,如下所示:
没有说哪一种更好,完全看需求。我的想法是 SPL 在列转行时可否有一个让用户自己选择是否显示 nulls 的选项?pivot@r().select() 不能说不方便,只是多写了一步,总觉得有点不爽。
关于 null 值,我再补充一点,当用 concat 时,是否可以忽略 null 的问题,比如,用以下数据做 groups 聚合,此时 concat 是聚合函数,而数据源中包含了 null,合并之后是这样的:
因为存在 null 值干扰,分隔符会重复出现。或者用 group,此时可以用 ~.fx() 可以用 select 过滤:
如果 concat 时可以有选项让用户自行选择是否忽略 null,是不是会好一些?
恳请大佬们得闲时帮忙看看上述两种情况,这样的 request 是不是我又 tmd 多事了😄 🙏
有关后一个问题,实际上只是在表中取出所需列,然后做串连接 concat 处理。这个根本用不着去做 group(;) 的处理,直接用 =E(?).select(a).concat@c()这种就可以了啊,如果保留 null,用 =E(?).(~).concat(“|”) 也就可以了。group 或者 groups 又不设聚集字段,实际上没有什么必要了。
并不是为了用 group(;),例子举得过于简单了。我只是为了说明 concat 作为聚合函数时,如果聚合对象中包含 nulls,正好这部分 nulls 也并不需要,当如何处理? 比如,在 groups 时,如果是 concat(字段; 分隔符),此时受 null 值干扰占了位分隔符重复了,此时如何去除这部分重复的分隔符?groups 之前对整个数据集 select 非 null? 还是 groups 聚合后再对聚合对象迭代替换 n 次直到分隔符变成 1 个? 举例中用了 group 作为另一种解法,只是为了说明在 group 里可以用 ~.fx() 这样自由度大一点写法,可以在分组子集中筛选过滤 null 后再 concat。
[1,null,2,null,null,3].concat@c()此时可以 select 后再 concat [1,null,2,nui,null,3].select(~).concat@c()
那对聚合对象操作时,咋弄? concat(聚合对象; 分隔符)
集算器的各个函数功能通常都比较直接,可以避免太多选项不易理解。groups 是计算聚合的,它支持的其实是聚合函数,,而常用聚合函数就是 sum/max/min/avg/count 之类。concat 这种并非常用聚合函数,所以才需要用 T.group(;(a).select().concat@c()) 这种方式,实际上,这种方式也是在聚合中使用非常用型聚合函数的通用方法。而前一个问题其实也类似这种情况,privot 的直接功能就是表的行列互转,而数据筛选用 select 即直接又方便记忆。
感谢大佬关注🙏 两个回合,已了然,不耽误大佬的时间,不纠结了😄