Arrays 如何在SAS中引用数组变量

Arrays 如何在SAS中引用数组变量,arrays,string,sas,Arrays,String,Sas,我有一个数据集输入,其中有一个名为color的变量,有两种类型: obs color 1 red 2 red 3 yellow 4 blue ... 现在我想为每种颜色创建标志: DATA COLOR; SET INPUT; ARRAY TYPES [3] RED YELLOW BLUE; FOR I = 1 TO DIM(TYPES) DO; IF COLOR = %unquote(%str(%')TYPES[I].%str(%')) THEN TYP

我有一个数据集输入,其中有一个名为color的变量,有两种类型:

obs  color
1     red
2     red
3     yellow
4     blue
...
现在我想为每种颜色创建标志:

DATA COLOR; SET INPUT;
ARRAY TYPES [3] RED YELLOW BLUE;
FOR I = 1 TO DIM(TYPES) DO; 
  IF COLOR = %unquote(%str(%')TYPES[I].%str(%')) THEN TYPE[I] = 1; 
  ELSE TYPE[I] = 0; 
END;
RUN;

因此,使用这种方式为数组变量添加引号并不奏效。因为我需要为每种颜色类型创建相同名称的flag,所以我认为作为数组更容易编写。如果您知道如何为数组变量添加引号,请告诉我。这样我就不需要写很多行的IF语句了。当颜色种类太多时。谢谢

对于您的示例来说,数组似乎有些过头了。如果要创建二进制变量,请将布尔表达式的结果指定给这些变量

data want;
  set have ;
  red = color='red';
  blue = color='blue';
  yellow = color='yellow';
run;
为了让数组的想法发挥作用,您需要使用VNAME()函数来查找与数组元素对应的变量的名称

data want ;
  set have ;
  array types red blue yellow ;
  do i=1 to dim(types);
    types(i)=upcase(color)=upcase(vname(types(i)));
  end;
run;

对于您的示例来说,数组似乎有些过头了。如果要创建二进制变量,请将布尔表达式的结果指定给这些变量

data want;
  set have ;
  red = color='red';
  blue = color='blue';
  yellow = color='yellow';
run;
为了让数组的想法发挥作用,您需要使用VNAME()函数来查找与数组元素对应的变量的名称

data want ;
  set have ;
  array types red blue yellow ;
  do i=1 to dim(types);
    types(i)=upcase(color)=upcase(vname(types(i)));
  end;
run;

谢谢成功了。但是它运行的时间比列出所有IF循环要长得多。您知道为什么吗?具有Do循环和多个函数调用的代码应该比仅比较值的代码慢,因为它正在执行更多的操作。因为大多数SAS代码都是I/O,不受CPU限制,所以时钟时间应该不会慢很多。谢谢。成功了。但是它运行的时间比列出所有IF循环要长得多。您知道为什么吗?具有Do循环和多个函数调用的代码应该比仅比较值的代码慢,因为它正在执行更多的操作。由于大多数SAS代码都是I/O,并且没有CPU限制,所以时钟时间不应该慢很多。