【问题标题】:Runing macro over all columns in SAS在 SAS 中的所有列上运行宏
【发布时间】:2021-09-16 06:58:47
【问题描述】:

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

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

【问题讨论】:

  • 可能甚至不需要宏!添加一些要编码的 3 个三列的样本数据,并显示它们是如何编码的。您可能只需要应用一个自定义格式,或使用一个数组 来遍历将要处理的变量列表。否则,您可以使用 SQL dictionary.columns 创建宏将通过宏 %DO 循环重复处理的变量列表。
  • 如果没有宏中内容的示例,无法回答。可能是数组比宏更有意义,或者使用用户定义的格式也更​​快。尽管完全可行,但宏可能不是最有效的答案。 stats.idre.ucla.edu/sas/seminars/sas-arrays

标签: sas sas-macro


【解决方案1】:

假设您需要物理更改此数据集中的所有字符变量。您可以在 data step 循环中轻松完成此操作。特殊关键字_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.);

【讨论】:

    猜你喜欢
    • 2019-12-24
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-13
    • 2011-03-02
    • 1970-01-01
    相关资源
    最近更新 更多