【问题标题】:SaS loop through single datasetSaS 循环遍历单个数据集
【发布时间】:2015-03-07 19:39:56
【问题描述】:

我不是 SaS 的火箭科学家,但我想尝试在 SaS 中和在 Java 中做同样的事情。

假设我有一个 SaS 数据集,我想逐条检查每条记录,然后将迭代中收集的值与最终数字进行比较。

在 Java 中,它将循环遍历一个数组,在这种情况下,该数组与来自 SaS 数据集的单个列的所有数据相同。

示例如下:

我有一个帐户余额列表,我想检查迭代中的当前余额是否高于之前存储的先前最大值,如果是,则存储它,并继续循环,直到我存储最高的帐户平衡。

我知道这可以使用 SQL max 来完成,但我想知道如何迭代 SaS 数据集,但我也会感谢任何有效的 SQL 答案。

SaS 数据集如下所示。

acct_number            owner_name            acct_balance
0123456789             name1                 12000
1234567890             name2                 16000
2345678901             name3                 14000

但我只对acct_balance 专栏感兴趣。

作为一个代码示例,在 Java 中应该是这样的。

int[] acct_balances = new int[8];
int[0] = 10000;
int[1] = 12000;
int[2] = 11000;
int[3] = 16000;
int[4] = 14000;
int[5] = 5000;
int[6] = 16000;
int[7] = 15000;
int max_balance = 0;
int max_balance_position = 0;

int iteration_position = 0;
int maximum_position = acct_balances.length;

do {
    if (acct_balances[iteration_position] > max_balance) {
      max_balance = acct_balances[iteration_position];
      max_balance_position = iteration_position;
    }
  iteration_position ++;
} while(iteration_position < maximum_position);

最后,输出将是max_balance = 16000max_balance_position = 3

这段代码遍历数组中的每一个值,但是如何将这段代码翻译成 SaS?谁能帮我?非常感谢。

【问题讨论】:

  • 可以添加SAS数据集的形式吗?没有这个就很难回答了。
  • SAS 通常使用全部大写字母书写(与 SaaS 不同)。每次看到这种混合情况时,我的大脑都想吐出来;-)
  • SAS 仅以大写形式正确拼写 - 而不仅仅是通常。它不再是首字母缩略词,即使是 A 也代表一个真实的单词(分析),而不是和。

标签: loops dataset sas


【解决方案1】:

SAS 隐式循环遍历每一行,因此您无需创建循环。问题是您希望输出数据集是什么样子。这个答案将创建一个仅包含最大值的数据集。

data max_acct_balance;
  set have end=eof;
   retain max_acct_balance max_record;
   if acct_balance>max_acct_balance then do;
      max_record=_n_;
      max_acct_balance=acct_balance;
   end;
   if eof then output;
run;

【讨论】:

  • 嗨,我已经检查了代码,它很有帮助。我欠债了。
【解决方案2】:

你可以在你的数据文件中添加一个cnt

proc sql;
     create table test as
            select *, monotonic() as cnt
                   from org_data_set;
quit;

然后使用:

proc sql;
     select bal, cnt-1 as CNT
            from test
                  where cnt = select min(cnt)
                                     from test 
                                          where bal = select max(bal) 
                                                from test;
quit;

【讨论】:

    猜你喜欢
    • 2017-10-31
    • 1970-01-01
    • 2016-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多