如何使 SAS 宏运行变量/列?

发布于 2024-11-19 12:19:00 字数 609 浏览 2 评论 0原文

我第一次尝试 SAS 宏。我的基本问题是:我有一个包含 10000 个变量的数据集。我需要单独获取每一列,创建一个新的条件变量,存储结果,然后移至下一列。这些列不是按顺序排列的。 SAS 使用什么语法来标识列(类似于“_N_”标识行的方式)?

这是更多信息。 数据看起来像这样:

ID  v1   v2   v3  ... v10000
01  3.2  1.5  7.8 ...   4.2
02  1.1  4.5  1.9 ...  10.7
..
 N  2.5  1.5  4.9 ...   7.3

我需要查看 v1 的值,计算有多少个 obs 高于值 x 以及有多少个低于值 x,将这些数字记录在数据集中,然后移至 v2、v3、...。 ..v10000。最后,我将得到一个数据集,该数据集将显示 10000 个变量中每个变量的高于值 x 的 obs 数量和低于值 x 的 obs 数量。

我已经编写了代码,就像我为标准 SAS 代码中的一个变量编写的那样,它可以工作,现在我的目的是将该代码转换为宏代码,但我不知道如何构造一个从一个变量移动的循环列到下一个。

您能提供的任何帮助或参考将不胜感激。

谢谢。

I am trying my hand at SAS macros for the first time. My basic question is: I have a dataset with some 10000 variables. I need to take each column individually, create a new conditional variable, store the results, then move to the next column. These columns are not sequentially ordered. What is the syntax SAS uses to identify a column (similar to how "_N_" would identify a row)?

Here is more information.
The data looks something like this:

ID  v1   v2   v3  ... v10000
01  3.2  1.5  7.8 ...   4.2
02  1.1  4.5  1.9 ...  10.7
..
 N  2.5  1.5  4.9 ...   7.3

I need to look at the values of v1, count how many obs are above a value x and how many are below a value x, record those numbers in a dataset, then move onto v2, v3, ... v10000. In the end, I'd have a dataset that would show the number of obs above value x and number of obs below value x for each of my 10000 variables.

I have written the code as I would have written it for one variable in standard SAS code and it works, and now my intention is to convert that code into macro code, but I do not know how to construct a loop that would move from one column to the next.

Any help or references you could give would be greatly appreciated.

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

多彩岁月 2024-11-26 12:19:00
%LET CUTOFF = 3.1415926 ; /* set this as your 'cutoff' value */

data counters ;
  set mydata end=eof ;

  array vi{*} v1-v10000 ; /* incoming values */
  array vc{*} c1-c10000 ; /* counters */

  retain vc . ;

  do i = 1 to dim(vi) ;
    if vi{i} >= &CUTOFF then vc{i} + 1 ;
  end ;

  if eof then output ;

  keep c1-c10000 ;
run ;
%LET CUTOFF = 3.1415926 ; /* set this as your 'cutoff' value */

data counters ;
  set mydata end=eof ;

  array vi{*} v1-v10000 ; /* incoming values */
  array vc{*} c1-c10000 ; /* counters */

  retain vc . ;

  do i = 1 to dim(vi) ;
    if vi{i} >= &CUTOFF then vc{i} + 1 ;
  end ;

  if eof then output ;

  keep c1-c10000 ;
run ;
二智少女猫性小仙女 2024-11-26 12:19:00

这不是最有效的方法,但这将为您提供 10000 个单独的数据集。

%macro splitdata;
%do i=1 %to 10000;
data v_&i;
   set v;
   array vArray[10000] v1-v10000;
   keep vArray[&i]; 
run;
%end splitdata;

%splitdata;

从那里,您可以在每个数据集 v_1、v_2、.... 上使用相同类型的宏 do 循环。

Not going to be the most efficient way but this will get you 10000 individual data sets.

%macro splitdata;
%do i=1 %to 10000;
data v_&i;
   set v;
   array vArray[10000] v1-v10000;
   keep vArray[&i]; 
run;
%end splitdata;

%splitdata;

From there you could employ the same sort of macro do loop on each data set v_1, v_2,....

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文