SAS New Variable Array from Single Variable



这应该是一个我无法回答的简单问题。我得到了一些调查数据,其中有几个问题,可以"尽可能多地选择适用的"。对于这些问题,回答选项存储为单个变量,用逗号分隔。

例如,假设问题1 (Q1)有9个不同的回答选项。对于这个问题,Person 1可能有三个回答,存储为:1,3,10,而Person 2可能有四个回答,存储为:2,3,8,9。

从这个单一变量(Q1),我想创建9个独立的变量,每个变量对应一个响应选项(Q1_1到Q1_9)。我相信我可以用ARRAY和do循环在一个DATA步骤中做到这一点,但INDEX或in函数都不起作用。下面是我一直在使用的代码:

DATA Final; SET Final; 
ARRAY Q1b{9} Q1_1 - Q1_9; *new variables I want to create;
DO i = 1 TO 9;
IF NOT MISSING(Q1) THEN Q1b{i} = 0; *works;
IF INDEX(Q1,"i") THEN Q1b{i} = 1; *Doesn't work;
IF Q1 IN: ("i") THEN Q1b{i} = 1; *Doesn't work either;
END;
RUN;

使用上面例子中的人的回答,第1个人的Q1_1值为1,而第2个人的Q1_1值为0。同样,第一人的q12值是0,而第二个人的q12值是1。我猜它与SAS如何存储循环I有关(我认为它类似于没有&的宏变量)。谢谢。

谢谢,瑞安

INDEX()需要字符串

IF INDEX(Q1,cats(i)) THEN Q1b{i} = 1;

注意,如果有超过9个可能的答案,则不会缩放,因为数字"1"将出现在"1"one_answers"10"中。因此,您可能希望使用INDEXW()。请确保除逗号外还包括空格作为分隔符,以防止尾随空格或逗号周围的空格成为字符串中单词的一部分。

IF INDEXW(Q1,cats(i),' ,') THEN Q1b{i} = 1;

布尔表达式的值为0或1。所以你的程序可以是:

data WANT;
set HAVE;
array q1_ [9] ;
do i = 1 to dim(q1_);
q1_[i] = 0<indexw(q1,cats(i),' ,');
end;
run;
  • 一般不应使用相同的输入输出数据集名称。使调试变得困难,有时你会得到意想不到的输出。
  • 在循环前检查变量是否为空,以避免不必要的循环
  • 删除i的引号,使用数字i。在引号中,它寻找字母i,而不是迭代器变量i。

可能是这样的:

DATA Final_expanded; /*1*/
SET Final; 
ARRAY Q1b{9} Q1_1 - Q1_9; *new variables I want to create;
if not missing(q1) then DO i = 1 TO 9; /*2*/
IF INDEX(Q1, i) THEN Q1b{i} = 1; /*3*/
END;
RUN;

编辑:由于某些原因无法使其工作,但此方法确实有效。

DATA Final_expanded; /*1*/
SET have; 
ARRAY Q1b{9} Q1_1 - Q1_9; *new variables I want to create;
nwords = countw(q1);
if not missing(q1) then DO i = 1 TO nwords; /*2*/
index = scan(q1, i);
q1b(index) = 1;
END;
RUN;

最新更新