在sas上循环,但不在宏上循环

时间:2014-07-04 12:45:31

标签: sas

这是一个简单的,但我有点挣扎。

我有什么:

enter image description here

我想要的是什么:

enter image description here

我想删除v0,v1等。

我正在使用这段代码

data IndieDay20140704;
set IndieDay20140704;
do i=1 to 5;
VAR1=tranwrd(var1,"v&i","");
end;
run;

它没有正常工作,因为它给了我这个(见下文)加上错误 WARNING: Apparent symbolic reference I not resolved.

enter image description here

问题:

1)我需要一个宏吗? 2)为什么会出错?

非常感谢您的见解。

2 个答案:

答案 0 :(得分:0)

由于您(无意中)使用宏变量i而未初始化,因此出现错误。

我想tranwrd的想法是从VAR2删除VAR3VAR1 ..中的字词。 逻辑错误也是为VAR1本身做的。

检查这是否有帮助(使用数组):

data IndieDay20140704;
length VAR1 VAR2 VAR3 VAR3 VAR5 $10;
VAR1 = 'TEST IT';VAR5 = 'TEST';
output;
VAR1 = 'STEST IT';VAR5 = 'TEST';
output;
run;

data IndieDay20140704_modified / view= IndieDay20140704_modified;
set IndieDay20140704;
    array vals VAR1 - VAR5;
    do i=1 to dim(vals);
        if i ne 1 then VAR1=tranwrd(var1,trim(vals(i)),"");
    end;
    drop i;
run;

这里我在桌面上创建一个SAS视图(不是一个覆盖源的好主意)。 另外我认为你应该trim()来自VAR2,VAR3的值...取决于你想要达到的目标以及数据中的内容。

编辑: 这里的版本是' v0',' v1' ...' v5'字符串:

data IndieDay20140704;
length VAR1$10;
VAR1 = 'TEST v0';
output;
VAR1 = 'TEST v11';
output;
VAR1 = 'TEST v1';
output;
run;

data IndieDay20140704_modified / view= IndieDay20140704_modified;
set IndieDay20140704;
    org_var1 = var1;
    do i=0 to 5;
        var1 =tranwrd(var1, catt('v', put(i, 1. -L)),"");
    end;
run;

catt('v', put(i, 1. -L))连接字符串' v'以及put的结果。 put(i, 1. -L))使用纯数字格式i将数字变量w.d转换为文本,此处使用1. - 足以支持单位数字,-L左对齐结果

答案 1 :(得分:0)

这是一种方式,还有很多其他方法,如果您的数据有很多可变性,这可能无效。

data have;
length VAR1$10;
VAR1 = 'fic19v0.csv';
output;
VAR1 = 'fic19v1.cs';
output;
run;


data want ;
set have;
original_var=var1;
var1=substr(var1, 1, index(var1, ".")-3)||".csv";

run;