Mathematica中的条件计数

时间:2011-06-24 19:38:22

标签: count wolfram-mathematica conditional

考虑以下列表:

dalist = {{1, a, 1}, {2, s, 0}, {1, d, 0}, {2, f, 0}, {1, g, 1}}

enter image description here

我想计算第一列中某个值在第3列中取特定值的次数。

所以在这个例子中我想要的输出是:

{{1,1,2}, {1,0,1}, {2,1,0}, {2,0,2}}

或:

enter image description here

最新的子列表{2,0,2}被读取为:当第一列中的值为2时,第3列中的对应值(矩阵世界中的相同行)出现两次。

我希望这不要混淆。我添加了第二列,以表达列彼此远离的事实。

如果可能,不应该进行重新排序。

编辑:

{1,2,3,4,5}

{1,0}

是我在数据中实际处理的列所采用的确切值。

我知道我错过了正确的描述。如果可以,请编辑并了解它。谢谢

4 个答案:

答案 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)

您可以结合使用OuterCount

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}]
]