创建扫描列表的列

时间:2012-08-29 13:28:56

标签: sas

Supose我有一个宏变量,这是一个单词列表

%LET myvariable= Avocado Banana Rice Corn Mango Milk Strawberry Banana Banana Lime;

现在,我希望有一个数据集,其中每一行都是该列表中的一个单词,另外还有一个ID号

ID    Ingredient
1     Avocado
2     Banana
3     Rice
4     Corn
5     Mango
6     Milk
7     Strawberry
8     Banana
9     Banana
10    Lime

我试过这样的事情:

DATA food;
DO id = 1 TO 10;
Ingredient= SCAN(&myvariable.,id,' ');
    OUTPUT;
END;
RUN;

但是这产生了一个错误:“ERROR 388-185:期望算术运算符。”

这似乎是一件微不足道的事情,但不知怎的,我被卡住了。所以任何帮助都将不胜感激。

一些背景知识:

在我的真实数据集中,这个宏变量是通过PROC SQL从数据集创建的,其中每个条目都有几个单词,用空格分隔。像这样:

Product_ID    Ingredients
1             Sugar Milk Vanilla
2             Corn Sugar Banana
3             Apple Banana Maple_Syrup Oats
...           ...

2 个答案:

答案 0 :(得分:4)

非常接近。如果不想评论为什么,您只需要在宏变量名称周围添加双引号:

DATA food;
   DO id = 1 TO 10;
      Ingredient= SCAN("&myvariable.",id,' ');
      OUTPUT;
   END;
RUN;

答案 1 :(得分:3)

不需要宏变量和其他所有东西。您可以直接从datastep执行此操作:

**
** CREATE SOME SAMPLE DATA
*;
data sentences;
  infile datalines truncover;
  input Product_ID    $
        Ingredients   $100.
        ;
datalines;
1 Sugar Milk Vanilla
2 Corn Sugar Banana
3 Apple Banana Maple_Syrup Oats
;
run;


**
** OUTPUT EACH WORD AS A ROW
*;
data words;
  length word $100;
  set sentences;
  retain id 0;

  cnt = 1;
  word = scan(ingredients,cnt);
  do while (word ne '');
    id = id + 1;
    output;
    cnt = cnt + 1;
    word = scan(ingredients,cnt);
  end;

  drop ingredients cnt;

run;