考虑以下列表:
dalist = {{1, a, 1}, {2, s, 0}, {1, d, 0}, {2, f, 0}, {1, g, 1}}
我想计算第一列中某个值在第3列中取特定值的次数。
所以在这个例子中我想要的输出是:
{{1,1,2}, {1,0,1}, {2,1,0}, {2,0,2}}
或:
最新的子列表{2,0,2}被读取为:当第一列中的值为2时,第3列中的对应值(矩阵世界中的相同行)出现两次。
我希望这不要混淆。我添加了第二列,以表达列彼此远离的事实。
如果可能,不应该进行重新排序。
编辑:
{1,2,3,4,5}
{1,0}
是我在数据中实际处理的列所采用的确切值。
我知道我错过了正确的描述。如果可以,请编辑并了解它。谢谢
答案 0 :(得分:4)
根据我的理解,这应该做到:
In[11]:= dalist = {{1, a, 1}, {2, s, 0}, {1, d, 0}, {2, f, 0}, {1, g, 1}}
Out[11]= {{1, a, 1}, {2, s, 0}, {1, d, 0}, {2, f, 0}, {1, g, 1}}
In[12]:= Map[Flatten, Tally[dalist[[All, {1, 3}]]]]
Out[12]= {{1, 1, 2}, {2, 0, 2}, {1, 0, 1}}
在您的示例中,您实际上没有组合{2,1},但是组合{2,0}两次,而不是一次 - 因此输出与您预期的不同。也就是说,如果我正确地理解了这个问题。
答案 1 :(得分:3)
您可以结合使用Outer
和Count
:
In[39]:= Flatten[Outer[
{#1, #2, Count[dalist, {#1, _, #2}]} &,
DeleteDuplicates@dalist[[All, 1]],
DeleteDuplicates@dalist[[All, -1]] ], 1]
Out[39]= {{1, 1, 2}, {1, 0, 1}, {2, 1, 0}, {2, 0, 2}}
答案 2 :(得分:3)
我尝试使用Sasha关于所需输出的假设来提出一些全新的东西,但它的代码与我想象的相似。差异仍然很有趣,可以发布。
{#1, #2, Count[dalist[[All, {1, 3}]], {##}]} & @@@
Tuples[
{DeleteDuplicates@dalist[[All, 1]],
DeleteDuplicates@dalist[[All, 3]]}
]
修改强>
随着您对输入的澄清,代码可以简化并实际改进为:
{#1, #2, Count[dalist[[All, {1, 3}]], {##}]}& @@@Tuples[{Range[5],{0,1}}]
只有在每列中实际存在每个可能结果的至少一个示例时,第一个版本才是正确的。
答案 3 :(得分:1)
以下是Sjoerd第二种方法的变体,可能更容易阅读和改编。
Join @@ Table[{i, j, dalist[[All, {1,3}]] ~Count~ {i, j}}, {i,5}, {j,0,1}]
可以以相同的方式使用Array
:
Join @@ Array[{##, dalist[[All, {1,3}]] ~Count~ {##}} &, {5,2}, {1,0}]
如果你的桌子很大,那么仅提取一次是值得的:
With[{x = dalist[[All, {1,3}]]},
Join @@ Array[{##, x~Count~{##}} &, {5,2}, {1,0}]
]