m*****r 发帖数: 51 | 1 我有observations with different starting points. 比如, 第一个人1月开始赚钱
, 第二个人2月开始赚钱, 第三个人4月开始赚钱。 现在我需要把所有的人在第一个
月赚的钱放到一个variable (time1)下, 第二个月(2月,3月,5月)的放到同一个
variable (time2)下, 依次类推, 对每个人都要看开始赚钱后接下来的24个月。 有没
有什么办法create time1-time24. 如果24个时间点一个个的来, 太慢了。
例子来了:
原data
ID Jan Feb March April May Jun ....Dec
1 20 30 40 50 0 50
2 10 15 20 25 30
3 30 30 40
我需要的是
ID time1 time2 time3 time4 ...tiimeN
1 20 30 40 50
2 10 15 20 25
3 30 30 40
不常用SAS, 简单点的方法比较好, 免得搞不懂:). 多谢! |
m***c 发帖数: 118 | 2 没完全看懂问题,你给个data sample可能会有助于别人理解你的问题。 |
m*****r 发帖数: 51 | 3 加了:), 谢谢.
【在 m***c 的大作中提到】 : 没完全看懂问题,你给个data sample可能会有助于别人理解你的问题。
|
s*********h 发帖数: 6288 | 4 SAS就是处理这种东西的时候特别麻烦。
你的原始数据的列数应该有最大值吧?比如说是N
那建一个array ORG {N} 把原来的那些列都扔进去。
然后建一个 array NEW {24} time1-time24
设一个indicator A来标记是不是开始算钱了
A=0;
k=1;
do i=1 to 24;
if A = 0 and org[i] ^=. then do;
new[1]=org[i];
A = 1;
k + 1;
end;
else if A = 1 and k <= 24 then do;
new[k] = org[i];
k + 1;
end;
end;
然后keep 这个array new好了。
大致上思路差不多。前提是如果开始赚钱了后面有一个月没赚钱也得算进去
|
m*****r 发帖数: 51 | 5 这个很好用! 非常感谢!
【在 s*********h 的大作中提到】 : SAS就是处理这种东西的时候特别麻烦。 : 你的原始数据的列数应该有最大值吧?比如说是N : 那建一个array ORG {N} 把原来的那些列都扔进去。 : 然后建一个 array NEW {24} time1-time24 : 设一个indicator A来标记是不是开始算钱了 : A=0; : k=1; : do i=1 to 24; : if A = 0 and org[i] ^=. then do; : new[1]=org[i];
|
s*********h 发帖数: 6288 | 6 回复了才发现有个typo, do i=1 to N
【在 m*****r 的大作中提到】 : 这个很好用! 非常感谢!
|
m***c 发帖数: 118 | 7 data a;
input ID $ jan feb mar apr may jun jul aug sep oct;
cards;
1 20 30 50 0 50 40 20 70 55 25
2 . . 30 50 0 90 40 0 40 20
3 . . . 60 20 0 50 10 0 40
;
data b(keep=ID time1-time10); set a;
length tot $ 100;
array am(10) jan--oct;
do i=1 to dim(am);
if am(i)<=0 then am(i)=.;
tot=compress(catx('',tot,am(i)),,'p');
end;
array at(10) time1-time10;
do j=1 to 10;
at(j)=scan(tot,j);
end;
run; |