テーブル作るぞ

0> [["label","t1","t2","t3"],["A",1,2,3],["B",4,5,6],["C",7,8,9]].inject([]){|r,a|r==[]?r.push(a):a.each_with_index{|v,i|i==0?r.push(v):puts([r[0][i],r[-1],v].join(","))};r}
t1,A,1
t2,A,2
t3,A,3
t1,B,4
t2,B,5
t3,B,6
t1,C,7
t2,C,8
t3,C,9
=> [["label", "t1", "t2", "t3"], "A", "B", "C"]

うーん、こうなってくると返値を答えにしたくなるな。

irb(main):008:0> [["label","t1","t2","t3"],["A",1,2,3],["B",4,5,6],["C",7,8,9]].inject([]){|r,a|r==[]?r.push(a):a.each_with_index{|v,i|i==0?r.push(v):i==1?r.push([v]):r.push(r.pop.push(v))};r}
=> [["label", "t1", "t2", "t3"], "A", [1, 2, 3], "B", [4, 5, 6], "C", [7, 8, 9]]
irb(main):009:0> [["label","t1","t2","t3"],["A",1,2,3],["B",4,5,6],["C",7,8,9]].inject([]){|r,a|a.each_with_index{|v,i|i==0?r.push(v):i==1?r.push([v]):r.push(r.pop.push(v))};r}
=> ["label", ["t1", "t2", "t3"], "A", [1, 2, 3], "B", [4, 5, 6], "C", [7, 8, 9]]

だめだ。

行列で言えば

[[行名1,0],[0行名2]]x[[a,b],[c,d]]x[[列名1,0],[0,列名2]]

というアルゴリズムまでわかったがrubyの行列は文字列が扱えない。

複数の配列 -> 合成された配列 はあるけど 合成された配列-> 複数の配列 はむずかしいな。
unzipか。
基本アルゴリズムは 先頭行を全部の行と zipして先頭行を削除で各要素を先頭要素と演算すればいいはず。
一つのストリームを複数のストリームに分割するってのはあり得ないのか?
unzipは対称に分割するもんなー