将文本发送到 sas 中的列

问题描述 投票:0回答:1

我想处理变量中以逗号分隔的值列表(例如 Q8)并创建相应的响应变量(Q8_1、Q8_2、...、Q8_17)。对于列表中的每个值,如果有值,我想将相应的响应变量设置为 1。如果该值缺失,则相应的响应变量应保留为空。以下是变量最初的样子的示例:

Q8

11

.

.

.

15,17

.

11,12,13,14,15

1,2,3,4,5,6,7,8,9,10

11

我尝试了类似的方法,但它没有正确计算 10+ 的值。有什么建议么?我并没有接受这个代码,所以如果有人有完全不同的代码,我可以接受。

data numeric2;
set numeric;
run;
%macro initial2(var, num);
data numeric2;
format &var._1 - &var._&num 8.;
set numeric2;
run;
%mend;
%macro pop_var(var, num);
data numeric2;
set numeric2;
if index(&var, "&num")>0 then &var._&num = 1;
run;
%mend pop_var;

%macro run_pop(var2, num2);
%initial2(&var2, &num2);
%do i = 1 %to &num2;
%pop_var(&var2, &i);
%end;
%mend;

%run_pop(Q8, 17);`
variables sas
1个回答
0
投票

下面的宏将创建一系列变量,如果在列表中则为 1,如果不在列表中则为 0。例如:

11 --> Q8_11 = 1
12 --> Q8_12 = 1

下面的宏的工作方式是首先循环所有逗号分隔的值并找到最大值。这将让您创建一个动态大小的数组。从那里,我们执行一个数据步骤,创建一个恰好需要大小的数组。我们循环遍历逗号分隔列表中的每个值,并将其相应的数组变量设置为 1。

您所需要的是:

  1. 您的输入数据集名称
  2. 您的输出数据集名称
  3. 你的变量名
    %macro create_vars(data=, out=, var=);
    
        /* Dynamically identify the max value in the data */
        data _null_;
            set have end=eof;
            where NOT missing(&var);

            retain max_value 1;
    
            do i = 1 to countw(&var);
                value = input(scan(&var, i), 8.);
    
                if(value > max_value) then max_value = value;
            end;
        
            if(eof) then call symputx('max_value', max_value);
        run;
    
        data &out;
            set &data;
            array &var._[&max_value];
    
            do i = 1 to countw(&var);
                j = input(scan(&var, i), 8.);
                &var._[j] = 1;
            end;
    
            drop i j;
        run;
    %mend;

    %create_vars(data=have, out=want, var=Q8);

© www.soinside.com 2019 - 2024. All rights reserved.