z****n 发帖数: 67 | 1 对下面这个data set我想实现的是针对每一行检查相应的变量var1 到变量var6。 如果
值在0 到
50之间的话,就把每一个相应的变量名称存在一个macro variable,并且以空格隔开。
所以最终
我要的结果是:
根据第1行有个macro variable叫做list1, 在list1里面存有变量var6
根据第2行有个macro variable叫做list2, 在list2里面存有变量var5 var6
根据第3行有个macro variable叫做list3, 在list3里面存有变量var4 var6
根据第4行有个macro variable叫做list4, 在list4里面是空的
并且每一行的新建的宏变量名,都要以该行的行序数结尾,比如1到4行,宏变量名相应
的为list1到list4
关键难点在于实际工作中我有300多个变量,所以必须一开始就把满足条件的变量名存在宏变量里
面,因为宏变量不会有长度的问题。如果先建立一个string变量存储那些满足条件的变量名,然后
再放到宏变量里面结果会有问题。因为string变量的长度会不够(SAS字符变量最大长度是200 |
D******n 发帖数: 2836 | 2 awaiting StatGuy to give u a python solution... |
b******e 发帖数: 539 | 3 The maximum length of any character variable in the SAS System is 32767
bytes. |
S******y 发帖数: 1123 | 4 #Python 2.5.4
#by_line.py 2010-09-02
#Per Da Sha Gen's request :-)
#A data structure proves to be handy here
S = '''0 0 0 0 0 1.2
0 0 0 0 5.8 4.7
58.8 0 0 30 0 33.3
100 0 0 100 0 66.6'''
ctr = 0
d={}
for line in S.split('\n'):
ctr += 1
d[ctr] = []
ls = [float(x) for x in line.split()]
for index, item in enumerate(ls):
if item < 50 and item > 0:
d[ctr].append(index+1)
else:
pass
#for examle, you would like to see line #3
line_number = 3
prin |
P****D 发帖数: 11146 | 5 那是老黄历了,现在是32767了。不过默认长度是200,你要更长的要事先声明length。
另:宏字符变量长度也有限制的,也是32767。
【在 z****n 的大作中提到】 : 对下面这个data set我想实现的是针对每一行检查相应的变量var1 到变量var6。 如果 : 值在0 到 : 50之间的话,就把每一个相应的变量名称存在一个macro variable,并且以空格隔开。 : 所以最终 : 我要的结果是: : 根据第1行有个macro variable叫做list1, 在list1里面存有变量var6 : 根据第2行有个macro variable叫做list2, 在list2里面存有变量var5 var6 : 根据第3行有个macro variable叫做list3, 在list3里面存有变量var4 var6 : 根据第4行有个macro variable叫做list4, 在list4里面是空的 : 并且每一行的新建的宏变量名,都要以该行的行序数结尾,比如1到4行,宏变量名相应
|
f*******e 发帖数: 51 | 6 try this:
data countmiss;
input var1 var2 var3 var4 var5 var6;
cards;
0 0 0 0 0 1.2
0 0 0 0 5.8 4.7
58.8 0 0 30 0 33.3
100 0 0 100 0 66.6
;
run;
data _null_;
set countmiss;
array var(*) var1-var6;
call symput("list"||strip(_N_),"");
do i=1 to dim(var);
if var(i)>0 and var(i) <50 then do;
call symput("list"||strip(_N_),symget("list"||strip(_N_))||" "||"var"||strip
(i));
end;
end;
run;
%put &list1 &list2 &list3 &list4;
【在 z****n 的大作中提到】 : 对下面这个data set我想实现的是针对每一行检查相应的变量var1 到变量var6。 如果 : 值在0 到 : 50之间的话,就把每一个相应的变量名称存在一个macro variable,并且以空格隔开。 : 所以最终 : 我要的结果是: : 根据第1行有个macro variable叫做list1, 在list1里面存有变量var6 : 根据第2行有个macro variable叫做list2, 在list2里面存有变量var5 var6 : 根据第3行有个macro variable叫做list3, 在list3里面存有变量var4 var6 : 根据第4行有个macro variable叫做list4, 在list4里面是空的 : 并且每一行的新建的宏变量名,都要以该行的行序数结尾,比如1到4行,宏变量名相应
|
z****n 发帖数: 67 | 7 多谢楼上提醒,把楼上的code改成下面的就可以运行啦!
data countmiss;
input var1 var2 var3 var4 var5 var6;
cards;
0 0 0 0 0 1.2
0 0 0 0 5.8 4.7
58.8 0 0 30 0 33.3
100 0 0 100 0 66.6
;
run;
data _null_;
set countmiss;
array v(*) var1-var6;
call symput("list"||compress(_N_),"");
do i=1 to dim(v);
if 0< v(i) <50 then do;
call
symput("list"||compress(_N_),left(trim(symget("list"||compress(_N_))||"
"||"
var"||compress(i))));
end;
end;
run;
%put list1=&list1 ;
%put list2=&list2 ;
%put list3=&list3 ;
%put list4=&lis |
b******e 发帖数: 539 | 8 我就是好奇为什么要把strip改成compress |
z****n 发帖数: 67 | |