使用Mathematica中从Tally命令返回的数据

时间:2013-05-11 08:52:18

标签: wolfram-mathematica

我有一小段代码来生成序列,这没关系。

List = Reap[
    For[i = 1, i <= 10000, i++, 
      Sow[RandomSample[Join[Table["a", {2}], Table["b", {2}]],  2]]];][[2, 1]];
Tally[List]

提供以下输出

{{{"b", "b"}, 166302}, {{"b", "a"}, 333668}, {{"a", "b"}, 332964}, {{"a", "a"}, 167066}}

我的问题是我还没有找到从输出中提取频率的方法....?

提前感谢您提供任何帮助

1 个答案:

答案 0 :(得分:2)

注意:通常不要使用大写字母启动用户创建的符号名称,因为这些名称可能与内部函数冲突。

我不清楚你希望如何转换输出。一种解释是你只想要:

{166302, 333668, 332964, 167066}

在您的代码中使用[[2, 1]],因此我假设您知道如何使用Part,这是一种简短形式。 Part的文档包括:

  

如果 i 列表中的任何一个是All;;,则会保留该级别的所有部分。

因此您可以使用:

Tally[list][[All, 2]]

你也可以使用:

Last /@ Tally[list]

作为george评论,您可以使用Sort,由于Tally数据的结构将首先按项排序,因为它首先出现在每个列表中,并且每个列表都有相同的长度。

tally = 
 {{{"b","b"},166302},{{"b","a"},333668},{{"a","b"},332964},{{"a","a"},167066}};

Sort[tally][[All, 2]]
{167066, 332964, 333668, 166302}

您还可以将数据转换为Rule个对象列表,然后从预定列表中提取值:

rules = Rule @@@ tally
{{"b", "b"} -> 166302, {"b", "a"} -> 333668, {"a", "b"} -> 332964, {"a", "a"} -> 167066}

这些可以按您选择的任何顺序排列:

{{"a", "a"}, {"a", "b"}, {"b", "a"}, {"b", "b"}} /. rules
{167066, 332964, 333668, 166302}

仅仅为了说明另一种技巧,如果您有一个特定的项目列表,您可以在此SowReap构造中找到值。例如,随机列表"a", "b", "c", "d"

SeedRandom[1];
dat = RandomChoice[{"a", "b", "c", "d"}, 50];

计算"a""c"元素:

Reap[Sow[1, dat], {"a", "c"}, Tr[#2] &][[2, All, 1]]
{19, 5}

这不如Tally快,但它比为每个元素执行Count要快,有时语法很有用。