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