使用if和do循环的数组问题

时间:2011-07-29 16:48:22

标签: algorithm language-agnostic

这是我的代码:

data INDAT8; set INDAT6;
Array myarray{24,27};
goodgroups=0;

do i=2 to 24 by 2;
   do j=2 to 27;

   if myarray[i,j] gt 1 then myarray[i+1,j] = 'bad';
       else if myarray[i,j] eq 1 and myarray[i+1,j] = 1 then myarray[i+1,j]= 'good';
   end;
end;
run;

proc print data = INDAT8; 运行;

问题:

我有这种格式的数据 - 这只是一个例子:n = 2     X Y信息

2      1       good
2      4       bad

3      2      good

4     1       bad
4      4      good

6       2     good
6       3     good

现在,上述数据按排序方式(共7行)。我需要分别创建一组2,3或4行并生成图表。在上面的数据中,我做了一组2行。由于第3行中没有其他列形成组,因此第三行保持不变。组只能在同一行内形成。不与其他行。

现在,我将检查两行是否在信息列中都有“好”。如果两行都“好” - 形成的组也很好,否则很糟糕。在上面的例子中,第3个/最后一个组是“好”组。休息都是坏组。一旦我完成所有行,我将计算总数。成立的良好团体/总数没有。小组。

在上面的例子中,输出将是:Total no。好团体/总数没有。 of groups =>三分之一。

这是n = 2(组的大小)的情况

现在,对于n = 3,我们组成3行,对于n = 4,我们组成4行,并以类似的方式找到好/坏组。如果组中的所有行都有“好”块 - 结果是好块,否则坏。

Example: n= 3

2      1       good
2      4       bad
2     6        good

3      2      good

4     1       good
4      4      good
4    6        good

6       2     good
6       3     good

在上面的例子中,我留下了第4行和最后2行,因为我不能用它们组成3行。第一组结果为“差”,最后一组结果为“好”     输出:1/2

For n= 4:

2      1       good
2      4       good
2     6        good
2      7       good

3      2      good

4     1       good
4      4      good
4    6        good

6       2     good
6       3     good
6       4     good
6       5     good

在这种情况下,我组成一组4并找到结果。第5,第6,第7,第8行被遗忘或被忽略。我制作了2组4行,两者都是“好”的块。     输出:2/2

因此,在从n = 2,n-3和n = 4获得3个输出值之后,我将绘制这些值的图表。

如果您可以使用数组帮助任何语言,if和do循环。这会很棒。

我可以相应地更改我的代码。

更新

对此的答案不一定是sas。由于它与算法相关的更多,我会接受任何语言的建议,只要它们显示如何使用数组和do来实现这一点。

1 个答案:

答案 0 :(得分:0)

我无法理解您的问题陈述,但我可以从此处收集的内容是我的建议:

将数据放入箱柜,处理汇总数据。

实施1

假设:您不知道第一列的范围是什么,或者解析将是稀疏的

  • 创建哈希表。密钥将是您正在进行分组的项目。该值将是到目前为止所见的数量。
  • 处理每条记录。如果密钥已存在,则递增计数(哈希中该键的值)。否则,添加密钥并将值设置为1。
  • 继续,直到您处理完所有记录
  • 计算哈希表中的键数以及大于阈值的值的数量。

实施2

假设:你知道第一列的范围和分布是相当密集的

  • 创建一个包含足够元素的整数数组,以便索引可以匹配列值。将所有元素初始化为零。此数组将保留您正在分组的每个项目的计数
  • 处理每条记录。检查第一列的值。增加数组中的相应索引。 (所以如果你有“2 1好”,请做groupCount [2] ++)
  • 继续,直到您处理完所有记录
  • 遍历数组中的每个元素。计算有多少项非零(意味着它们至少出现一次)以及有多少项符合您的阈值。

您可以使用相同的方法收集好的和坏的数量。