0

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

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

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

提前感谢您的帮助

4

1 回答 1

2

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

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

{166302, 333668, 332964, 167066}

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

如果任何列表iAll;;,则保留该级别的所有部分。

因此,您可以使用:

Tally[list][[All, 2]]

您还可以使用:

Last /@ Tally[list]

作为乔治评论你可以使用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}

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

于 2013-05-11T09:46:36.377 回答