如何把多列数据拆分后变成多行数据
某Excel从第2列开始,每两列是一对(即除第1列之外的偶数列和奇数列,比如第2和列第3列),这样的列共4对,具体如下:
A |
B |
C |
D |
E |
F |
G |
H |
I |
|
1 |
Micro |
Group |
Series |
Group1 |
Series1 |
Group2 |
Series2 |
Group3 |
Series3 |
2 |
1 |
Back |
3 |
Biceps |
1 |
Delts |
1 |
Traps |
1 |
3 |
1 |
Chest |
4 |
Triceps |
2 |
Delts |
2 |
||
4 |
1 |
Biceps |
2 |
||||||
5 |
1 |
Cuads |
4 |
Glut |
2 |
||||
6 |
2 |
Back |
4 |
Biceps |
2 |
Delts |
2 |
Traps |
2 |
7 |
2 |
Chest |
5 |
Triceps |
3 |
Delts |
3 |
||
8 |
2 |
Biceps |
3 |
||||||
9 |
2 |
Cuads |
5 |
Glut |
3 |
计算目标:按照第1列、所有的偶数列分组,组内对奇数列汇总。结果应当如下:
A |
B |
C |
|
1 |
1 |
Back |
3 |
2 |
1 |
Biceps |
3 |
3 |
1 |
Chest |
4 |
4 |
1 |
Cuads |
4 |
5 |
1 |
Delts |
3 |
6 |
1 |
Glut |
2 |
7 |
1 |
Traps |
1 |
8 |
1 |
Triceps |
2 |
9 |
2 |
Back |
4 |
10 |
2 |
Biceps |
5 |
11 |
2 |
Chest |
5 |
12 |
2 |
Cuads |
5 |
13 |
2 |
Delts |
5 |
14 |
2 |
Glut |
3 |
15 |
2 |
Traps |
2 |
16 |
2 |
Triceps |
3 |
这里的难点是把N列化为3列(第1列,所有的偶数列,所有的奇数列),之后进行分组汇总就会简单许多。把N列化为3列,需要对每行取“N除以2后取整”次数据,比如第2行要取4次数据,分别是1/2/3、1/4/5、1/6/7、1/8/9。类似的有序计算很难用Excel公式表达。
实现步骤:
1. 运行集算器(可以到润乾官网下载,用职场版,首次运行时会提示加载授权,下载个免费的就够了)
2. 编写脚本并执行
A |
|
1 |
=file("data.xlsx").xlsimport@w().to(2,) |
2 |
=A1.news(~.len()\2;A1.~(1):Micro,A1.~(#*2):Group,A1.~(#*2+1):Series) |
3 |
=A2.groups(Micro,Group;sum(Series):Series) |
4 |
=file("result.xlsx").xlsexport@t(A3) |
脚本函数xlsimport可读入Excel文件,因为列头无用,所以用to(2,)取第二行到最后一行,news函数把一行变多行,其中 ~.len()\2 是要变成的行数,即N除以2后取整,比如原第2行需变成新4行。然后按顺序从原行取出列并组成新行,~(1)是第 1 列,# 是当前次数(即第 1、2、3、4 次),~(#*2) 是偶数列(即 2、4、6、8 列),~(#*2+1) 是奇数列(即 3、5、7、9 列)。最后group用来分组汇总。