首页 > 解决方案 > 如何创建名称与两个数组变量名称连接的变量

问题描述

我有一个具有成员 ID 和 79 个二进制变量的 HCC 数据集 DATA_HCC:

Member_ID   HCC1    HCC2    HCC6    HCC8 ...    HCC189
XXXXXXX1    1       0       1       0    ...    0
XXXXXXX2    0       0       1       0    ...    0
XXXXXXX3    0       1       0       0    ...    1

我正在尝试创建一个输出数据集,该数据集可以为这 79 个变量的所有组合创建新的二进制变量。每个新变量表示成员是否将两个变量都设为 1。

%LET hccList =  HCC1 HCC2 HCC6 HCC8 HCC9 HCC10 HCC11 HCC12 HCC17 HCC18 HCC19 HCC21 HCC22 HCC23 HCC27 
                HCC28 HCC29 HCC33 HCC34 HCC35 HCC39 HCC40 HCC46 HCC47 HCC48 HCC54 HCC55 HCC57 HCC58 
                HCC70 HCC71 HCC72 HCC73 HCC74 HCC75 HCC76 HCC77 HCC78 HCC79 HCC80 HCC82 HCC83 HCC84 
                HCC85 HCC86 HCC87 HCC88 HCC96 HCC99 HCC100 HCC103 HCC104 HCC106 HCC107 HCC108 HCC110 
                HCC111 HCC112 HCC114 HCC115 HCC122 HCC124 HCC134 HCC135 HCC136 HCC137 HCC157 HCC158 
                HCC161 HCC162 HCC166 HCC167 HCC169 HCC170 HCC173 HCC176 HCC186 HCC188 HCC189;

DATA COUNT_HCC; SET DATA_HCC;
    ARRAY HCC [*] &hccList.;
    DO i = 1 TO DIM(HCC);
        DO j = i+1 TO DIM(HCC);
            %LET HCC_COMBO = CATX('_', VARNAME(HCC[i]), VARNAME(HCC[j]));
            &HCC_COMBO. = MIN(HCC[i], HCC[j]);
        END;
    END;
RUN;

我尝试使用 CATX 函数来连接两个变量名,但它不起作用。

这是我得到的日志错误:

ERROR: Undeclared array referenced: CATX.
ERROR: Variable CATX has not been declared as an array.
ERROR 71-185: The VARNAME function call does not have enough arguments.

结果输出示例如下:

Member_ID   HCC1_HCC2    HCC1_HCC6    HCC1_HCC8   ...    HCC188_HCC189
XXXXXXX1    0               1           0         ...       0
XXXXXXX2    0               0           0         ...       0
XXXXXXX3    0               0           0         ...       1

标签: sas

解决方案


要实现动态变量名称生成,请使用宏来创建您需要的变量。以下代码生成动态变量名称并生成数据步骤代码以创建变量。

%macro get_hcc_combo_mins;
    %do i = 1 %to %sysfunc(countw(&hccList.));
        %do j = %eval(&i.+1) %to %sysfunc(countw(&hccList.));
            %let hcc1 = %scan(&hccList., &i.);
            %let hcc2 = %scan(&hccList., &j.);

            &hcc1._&hcc2. = min(&hcc1., &hcc2.);
        %end;
    %end;
%mend;

DATA COUNT_HCC; SET DATA_HCC;
    ARRAY HCC [*] &hccList.;
    %get_hcc_combo_mins;
RUN;

%get_hcc_combo_mins在数据步骤中生成此代码:

HCC1_HCC2 = min(HCC1, HCC2);
HCC1_HCC6 = min(HCC1, HCC6);
HCC1_HCC8 = min(HCC1, HCC8);
...

可能有其他方法可以在我不知道的一个数据步骤中完成这一切,但宏可以完成这项工作。


推荐阅读