8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

SAS 宏使用列表迭代 proc 频率

Michu93 2月前

95 0

我有一个数据集,其中我必须对十几个组织的十几个变量运行频率。使用 proc print 很容易,但我不想多次更新 WHERE 语句...

我有一个数据集,其中我必须对十几个组织的十几个变量运行频率。使用 proc print 可以很容易地做到这一点,但我不想为了运行每个频率而更新 WHERE 语句十几次,所以我希望使用宏来简化此过程。

作为示例,我们可以使用 sashelp.cars 数据集,其中每个汽车制造商运行两个变量的频率(为简单起见)。

我编写了一个宏,希望迭代一个简单的 proc 频率,如下所示,不同之处在于该宏会遍历 WHERE 语句中的汽车制造商 \'make\' 列表并运行指定的频率。

proc freq data=sashelp.cars; 
    table Type DriveTrain;
    where make = "Honda";
run;

这是我写的宏:

%macro car_freq(dataset, n_make);
    %do i = 1 %to &n_make;
        %let maker =  %scan(make., &i);

        title "&maker";
    proc freq data=&dataset;
        where make = "&maker";
        tables type DriveTrain;
    run;
title;
%end;
%mend car_freq;

%car_freq(sashelp.cars, 38)

当我运行宏时,它运行没有错误,但显示每次迭代有 0 个观察值。我缺少什么来让它遍历制造商列表并运行两个变量的频率?

帖子版权声明 1、本帖标题:SAS 宏使用列表迭代 proc 频率
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Michu93在本站《loops》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 我有一个带有表单的网页,我想重新组织它。所有字段都在一个

    ,并对其进行重新排序,我创建了其他表。我现在想分派第一个表的字段...

    我有一个带有表单的网页,我想重新组织它。所有字段都在一个

    ,并对其进行重新排序,我创建了其他表。现在我想在给定特定条件的情况下分派第一个表的字段。我的问题是,当我循环遍历我的元素并移动它们时,javascript 数组正在发生变化,因此缺少一些项目。

    实现我的目标的最佳方法是什么?

    前 :

    <table id='tableForm'><tbody>
      <tr><td>Some Input to stay here</td></tr>
      <tr><td>Some Input to stay here</td></tr>
      <tr><td>Some Input to move to tab1</td></tr>
      <tr><td>Some Input to move to tab2</td></tr>
      <tr><td>Some Input to stay here</td></tr>
      <tr><td>Some Input to move to tab2</td></tr>
      <tr><td>Some Input to move to tab1</td></tr>
    </tbody></table>
    
    <table id='tab1'>
      <tbody></tbody>
    </table>
    <table id='tab2'>
      <tbody></tbody>
    </table>
    

    (是的,没有类也没有 id 来选择元素,只能基于 innerText)

    后 :

    <table id='tableForm'><tbody>
      <tr><td>Some Input to stay here</td></tr>
      <tr><td>Some Input to stay here</td></tr>
      <tr><td>Some Input to stay here</td></tr>
    </tbody></table>
    <table id='tab1'><tbody>
      <tr><td>Some Input to move to tab1</td></tr>
      <tr><td>Some Input to move to tab2</td></tr>
    </tbody></table>
    <table id='tab2'><tbody>
      <tr><td>Some Input to move to tab2</td></tr>
      <tr><td>Some Input to move to tab2</td></tr>
    </tbody></table>
    

    到目前为止我已经做了:

    var toMove = {
      'Input to move to tab1' : 'tab1',
      'Input to move to tab2' : 'tab2',
    }
    $('table#tableForm')[0].firstChild.childNodes.forEach((c) => {
      content = $(c).find('td')[0].innerText
      if (toMove[content]) {
        $('#'+toMove[content]).appendTo(c)  // <= This change *.childNodes, next iteration will miss the next element
      }
    });
    

    鉴于 Javascript 的特性,迭代器不会遍历每个元素。当我们从节点中删除一些元素时,下一个元素将取代当前元素,并且将在下一次迭代中被遗漏。

    s 和 i 做一些魔术 j ,但是有没有简单的方法可以实现这一点?

    返回
    主题数
    0
    帖子数
    0
    精华数
    0
    注册排名
    17798
    作者最近主题: