这可能是一个较低级别的问题,但我正在努力寻找一个正确的答案: 假设我有一个列表(或矩阵):
{
{{1},{1},{1},{2},{2},{2}},
{{3},{4},{5},{6},{7},{8}}
}
现在我想以这样的方式组合列,即将具有相同第一个元素的列组合在一起,即
{
{{1},{2}},
{{3,4,5},{6,7,8}}
}
有没有快速实现这一目标的方法?对不起任何可能的混淆! 谢谢!
答案 0 :(得分:1)
这个怎么样:
a = {{{1}, {1}, {1}, {2}, {2}, {2}},
{{3}, {4}, {5}, {6}, {7}, {8}}};
b = GatherBy[Transpose@a, First];
c = DeleteDuplicates@First@a;
d = Array[b[[#, All, 2, 1]] &, Length@c];
{c, d}
{{{1},{2}},{{3,4,5},{6,7,8}}}
答案 1 :(得分:1)
Chris Degnen已经提出了一个非常好的方法,但我想发表一些意见。它有助于使您的数据采用 Mathematica 函数最方便操作的格式,通常是行而不是列。这就是他回答Transpose
的原因。
编辑:我想我误解了你的输出代表什么。我已相应地重写了我的答案。
使用GatherBy
,正如克里斯所做的那样:
a = {{{1}, {1}, {1}, {2}, {2}, {2}}, {{3}, {4}, {5}, {6}, {7}, {8}}};
{#[[All, 1, 1]], #[[All, All, 2, 1]]} & @ GatherBy[a\[Transpose], First]
{{{1}, {2}}, {{3, 4, 5}, {6, 7, 8}}}
或使用Sow
和Reap:
Reap[MapThread[Sow[#2, #] &, a], _, {{#}, Join @@ #2} &][[2]]\[Transpose]
{{{1}, {2}}, {{3, 4, 5}, {6, 7, 8}}}
此处MapThread
取代了最初的Transpose
。