w*******e 发帖数: 182 | 1 一组肥胖者的体重数据。id是肥胖者,weight是体重,按时间顺序week测量的。但是数
据里很多缺失值,不是标注成 . 的missing value,就是直接没有那些数据。
id weight week
1 280 1
1 280 2
1 279 3
1 275 7
1 276 8
1 275 9
1 276 10
2 217 1
2 217 2
2 218 3
2 218 4
2 217 5
2 216 6
2 216 7
2 217 8
2 217 9
2 216 10
3 279 5
3 278 8
3 278 9
3 277 10
最后呢,想report出来,统计每个id缺失的时间在哪一段。结果看起来类似于下面这个
样子的,请问该怎么处理。
id missingweek
1 4-6
2 none
3 1-4, 6-7
另外,还想发现每个人体重的变化效果,就是compare the variance of each id's
weight.
多谢了先,有包子答谢。 |
w*******e 发帖数: 182 | 2 想过用 proc freq来做, 能找出那些有缺失值的id,但是不知道怎么address它们的缺
失范围。请求大侠指点。
data patient;
input id weight week;
cards;
1 280 1
1 280 2
1 279 3
1 275 7
1 276 8
1 275 9
1 276 10
2 217 1
2 217 2
2 218 3
2 218 4
2 217 5
2 216 6
2 216 7
2 217 8
2 217 9
2 216 10
3 279 5
3 278 8
3 278 9
3 277 10
run;
proc freq data=patient;
tables id/ out=id_freq (drop=percent);
run;
%let normal_freq= 10;
data id_freq;
set id_freq;
if Count NE &normal_freq then Missing=1;
else Missing=0;
run;
【在 w*******e 的大作中提到】 : 一组肥胖者的体重数据。id是肥胖者,weight是体重,按时间顺序week测量的。但是数 : 据里很多缺失值,不是标注成 . 的missing value,就是直接没有那些数据。 : id weight week : 1 280 1 : 1 280 2 : 1 279 3 : 1 275 7 : 1 276 8 : 1 275 9 : 1 276 10
|
j******o 发帖数: 127 | 3 先对所有ID生成一个假的但week不缺的data,再merge by ID WEEK, 缺失weight的week
就是你要的时间。
proc sort data=patient out=two(keep=id) nodupkey; by id; run;
data _tem;
set two;
do week=1 to 10;
output;
end;
run; |
p***7 发帖数: 535 | 4 I don't know but show some support here. |
w*******e 发帖数: 182 | 5 great. 确实可以,把两个data set merge后,只取缺失week的部分,就是离想要的
table还有一点距离。
顺便问问,有没有其他什么方法,比如sql来做。
week
【在 j******o 的大作中提到】 : 先对所有ID生成一个假的但week不缺的data,再merge by ID WEEK, 缺失weight的week : 就是你要的时间。 : proc sort data=patient out=two(keep=id) nodupkey; by id; run; : data _tem; : set two; : do week=1 to 10; : output; : end; : run;
|
p********r 发帖数: 1465 | |
w*******e 发帖数: 182 | 7 屁股哥,记忆力太好了,我兴趣广泛撒。
【在 p********r 的大作中提到】 : 记得你不是从事marketing行业么?
|
s******r 发帖数: 1524 | 8 data patient22;set patient;by id week;
flr_week=lag(week);
if id=lag(id) and flr_week
awkward but works.
proc sql;
create table patient2 as select * from
(select a.id, a.week, min(b.week) as week2 from patient a
inner join patient b
on a.id=b.id and a.week
group by a.id, a.week) aa left outer join
(select a.id,a.week from patient a inner join patient b
on a.id=b.id and a.week=b.week-1) bb
on aa.id=bb.id and aa.week=bb.week
where bb.id is null;
quit;run;
you work in marketing? I am interested in some marketing position. Do you
mind to share some basic model experience?
【在 w*******e 的大作中提到】 : great. 确实可以,把两个data set merge后,只取缺失week的部分,就是离想要的 : table还有一点距离。 : 顺便问问,有没有其他什么方法,比如sql来做。 : : week
|
p********r 发帖数: 1465 | 9 那就在此基础上再做一次merge(先把之前缺失weight的填上个数字),这样得到的
week+1/-1就分别是各区间的最小/最大值。
【在 w*******e 的大作中提到】 : great. 确实可以,把两个data set merge后,只取缺失week的部分,就是离想要的 : table还有一点距离。 : 顺便问问,有没有其他什么方法,比如sql来做。 : : week
|
l****u 发帖数: 529 | 10 proc sort data=one out=one;
by id week;
run;
data two;
set one;
retain w1-w10;
array new[10] w1-w10;
by id week;
if first.week then
do [i]=1 to 10;
new[i]=.;
end;
new[week]=weight;
if last.week;
run;
有包子? |