首页 > 解决方案 > 在SAS中的所有列上运行宏

问题描述

我有一个宏,我们称之为 %encoding(dataset, var),它对给定数据集中的一些分类变量 (var) 进行编码。

我想做的是为我的数据集中的所有字符变量运行这个宏,但我不知道该怎么做。我的集合有很多变量,所以手动编写它是不可能的。

标签: sassas-macro

解决方案


假设您需要物理更改此数据集中的所有字符变量。您可以轻松地data step循环执行此操作。special 关键字_CHARACTER_为您选择所有字符变量。将它们保存到一个数组中,您可以遍历它们。

data want;
    set have;
    array charvars[*] _CHARACTER_;
     
    do i = 1 to dim(charvars);
        charvars[i] = <logic goes here>;
    end;

   drop i;
run;

如果您需要更改多个变量的格式,proc datasets这将是一种有效的方法。您可以使用相同的技巧。

proc datasets lib=libref nolist;
    modify have;
        format _CHARACTER_ <format here>;
quit;

下面的这个宏将指定的以空格分隔的变量列表更改为您指定的单一格式,但您可以轻松修改它以将特定格式与宏循环中的特定变量相关联。

%macro encoding(data=, vars=, format=);

    %let data = %upcase(&data.);

    /* Split out libname and dataset name */
    %if(%scan(&data., 2, .) =) %then %do;
        %let lib = WORK;
        %let dsn = &data.;
    %end;
        %else %do;
            %let lib = %scan(&data., 1, .);
            %let dsn = %scan(&data., 2, .);
        %end;

    proc datasets lib=&lib. nolist;
        modify &dsn.;
            format &vars. &format.;
    quit;

%mend;

例子:

data cars;
    set sashelp.cars;
run;

%encoding(data=cars, vars=EngineSize Cylinders Horsepower, format=z5.);

推荐阅读