a********i 发帖数: 205 | 1 旧的dataset是
Patient LD
1001 5
1001 45
1001 70
新的dataset是
Patient LD Change
1001 5 40
1001 45 25
1001 70 .
其实change就是下面一个减去上面一个
请教大神们怎么得出change这个variable啊? |
h******e 发帖数: 1791 | |
a********i 发帖数: 205 | 3
楼上的,不对,我用lag会变成以下的dataset,
Patient LD Change
1001 5 .
1001 45 40
1001 70 25
【在 h******e 的大作中提到】 : lag function.
|
h******e 发帖数: 1791 | 4 你先倒着sort一遍不就行了吗?或者你用retain也行。
【在 a********i 的大作中提到】 : : 楼上的,不对,我用lag会变成以下的dataset, : Patient LD Change : 1001 5 . : 1001 45 40 : 1001 70 25
|
a********i 发帖数: 205 | 5 你先倒着sort一遍不就行了吗?或者你用retain也行。
求教用retain怎么用?我也隐约觉得应该是retain但是具体就不知道怎么写
【在 a********i 的大作中提到】 : : 楼上的,不对,我用lag会变成以下的dataset, : Patient LD Change : 1001 5 . : 1001 45 40 : 1001 70 25
|
o****o 发帖数: 8077 | 6 data new;
merge old old(firstobs=2 rename=(LD=LD2));
Change=LD2-LD;
drop LD2;
run;
【在 a********i 的大作中提到】 : 旧的dataset是 : Patient LD : 1001 5 : 1001 45 : 1001 70 : 新的dataset是 : Patient LD Change : 1001 5 40 : 1001 45 25 : 1001 70 .
|
e****t 发帖数: 766 | 7 还带回声的。
【在 a********i 的大作中提到】 : 你先倒着sort一遍不就行了吗?或者你用retain也行。 : : 求教用retain怎么用?我也隐约觉得应该是retain但是具体就不知道怎么写
|
m*****a 发帖数: 658 | 8 也考虑了多个patient 的情况:
data try;
input patient LD;
datalines;
1001 5
1001 45
1001 70
1002 10
1002 20
1002 35
run;
proc sort data=try;
by patient descending LD;
run;
data try2;
set try;
change=lag(LD)-LD ;
if lag(patient)~=patient then change=".";
run;
proc sort data=try2;
by patient LD;
run; |
k*******a 发帖数: 772 | 9 LZ没说LD是排列好的把,只是刚好给的数据是排列好的。
【在 m*****a 的大作中提到】 : 也考虑了多个patient 的情况: : data try; : input patient LD; : datalines; : 1001 5 : 1001 45 : 1001 70 : 1002 10 : 1002 20 : 1002 35
|
m*****a 发帖数: 658 | 10
There is a patient variable in then data set. And I think, in general, this
kind of calculation makes sense only for the same patient. If not, just
remove the line with if statement.
【在 k*******a 的大作中提到】 : LZ没说LD是排列好的把,只是刚好给的数据是排列好的。
|
|
|
m*****a 发帖数: 658 | 11 oh, sorry, I see what you mean now. LA is supposed to be ordered since LZ
want the current one minus the previous one.
Just let's see what LZ will say.
【在 k*******a 的大作中提到】 : LZ没说LD是排列好的把,只是刚好给的数据是排列好的。
|
y*****e 发帖数: 777 | 12 我觉得这个应该就可以实现了啊。
【在 o****o 的大作中提到】 : data new; : merge old old(firstobs=2 rename=(LD=LD2)); : Change=LD2-LD; : drop LD2; : run;
|
b*****e 发帖数: 223 | 13 嗯,~= 是什么?
【在 m*****a 的大作中提到】 : 也考虑了多个patient 的情况: : data try; : input patient LD; : datalines; : 1001 5 : 1001 45 : 1001 70 : 1002 10 : 1002 20 : 1002 35
|
P****D 发帖数: 11146 | 14 See this http://www.ats.ucla.edu/stat/sas/faq/tsvars.htm
Use the part with "lead" as in "transformout=(lead 1)"
【在 k*******a 的大作中提到】 : LZ没说LD是排列好的把,只是刚好给的数据是排列好的。
|
m*****a 发帖数: 658 | 15 Thanks, PharmD. It is very useful.
data try;
input patient LD;
datalines;
1001 5
1001 45
1001 70
1002 10
1002 35
1002 20
run;
proc expand data=try out=try1 method=none;
convert LD=LD_lead /transformout=(lead 1);
by patient;
run;
data try2 ;
set try1;
change=LD_lead-LD;
keep patient LD change;
run;
【在 P****D 的大作中提到】 : See this http://www.ats.ucla.edu/stat/sas/faq/tsvars.htm : Use the part with "lead" as in "transformout=(lead 1)"
|
a********i 发帖数: 205 | 16 多谢各位大神
总结一下还是这样写最好:
data old;
input patient LD;
datalines;
1001 5
1001 45
1001 70
1002 10
1002 20
1002 35
run;
proc sort data=old;
by patient;
run;
Data new(drop=LD2);
merge old old(firstobs=2 rename=(LD=LD2));
by patient;
change=LD2-LD;
if last.patient then change=.;
run; |
d*******o 发帖数: 493 | 17 这个题本猫当年面试的时候被考无数遍了,就是考dif()function.
BTW, 楼主的最后方法好像不work。 |
a********i 发帖数: 205 | 18 这个题本猫当年面试的时候被考无数遍了,就是考dif()function.
BTW, 楼主的最后方法好像不work。 |
k*******a 发帖数: 772 | 19 我这个似乎work,不过有点复杂,还是用proc expand最好
data try;
input patient LD;
datalines;
1001 5
1001 45
1001 70
1002 10
1002 35
1002 20
run;
data change;
set try;
by patient;
change=LD-lag(LD);
output;
if last.patient then do;
change=.;
output;
end;
data change;
set change;
by patient;
if first.patient ne 1;
keep change;
data try;
merge try change;
proc print data=try;run; |
P****D 发帖数: 11146 | 20 往回一个或多个都容易,往前比较麻烦。DIF也是只管往回……
【在 d*******o 的大作中提到】 : 这个题本猫当年面试的时候被考无数遍了,就是考dif()function. : BTW, 楼主的最后方法好像不work。
|
a********i 发帖数: 205 | 21
得到安慰了,只能说那家公司变态了,短时间答不上不怪我,哈哈
【在 P****D 的大作中提到】 : 往回一个或多个都容易,往前比较麻烦。DIF也是只管往回……
|
R*****g 发帖数: 99 | 22 DATA WANT;
set have;
by patient;
set have(keep=LD fistobs=2 rename=(LD=LD2)) have(obs=1 drop=_all_) ;
dif_raw=LD-LD2;
dif=ifn(last.patient, (.),dif_raw);
keep patient LD dif;
RUN;
【在 a********i 的大作中提到】 : : 得到安慰了,只能说那家公司变态了,短时间答不上不怪我,哈哈
|