2013-05-11 27 views
0

我有一小段代码来生成序列,这没关系。在Mathematica中使用数据返回的Tally命令

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

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

预先感谢任何帮助

+0

你是什么意思?当然输出显示每个出现的次数,可能是你的“频率”。你想用这些数据做什么? – 2013-05-11 09:34:16

+0

是的输出显示了每一对的频率,但我需要把每对(a,b)等的总数和使用他们的情节/图等,当我必须手动输入“166302”等我需要时以绘制哪些是缓慢和乏味的... – user2372443 2013-05-11 09:38:53

+0

我添加了答案。这是你想要的还是其他的东西? – 2013-05-11 09:46:58

回答

2

注:一般不以大写字母,因为这些可能内部职责相冲突的启动用户创建的符号名。

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

{166302, 333668, 332964, 167066} 

在你的代码使用[[2, 1]],所以我想你知道如何使用Part,这是其中的简写形式。对于Part文档包括:

如果任何列表All;;的,在该级别的所有部件保持。

你可以因此使用:

Tally[list][[All, 2]] 

您还可以使用:

Last /@ Tally[list] 

由于george评论,你可以使用Sort,这是由于Tally数据结构将首先按项目排序,因为它首先出现在每个列表中,并且每个列表具有相同的文件NGTH。

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,有时候这个语法很有用。

+0

那有用,我可以使用重复中的数据谢谢!是否可以按特定顺序排列由命令返回的四个数字列表?例如{AA的数量,BB的AB的BA的数量}。之所以我问这个问题,是因为我每次运行代码都会改变输出的顺序。 – user2372443 2013-05-11 10:04:41

+0

Sort @ Tally会给你一个一致的顺序。 – agentp 2013-05-11 16:28:37

+0

感谢Mr.Wizard和George的帮助,我非常感谢。我现在可以生成图表,而无需手动输入值,并且图表上的标签相互匹配......再次感谢这将为我节省大量时间.. – user2372443 2013-05-13 16:20:52