全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
7674 17
2015-05-26
悬赏 1000 个论坛币 已解决
想说的几点是:
id有很多个,需要把每个id在每个t时刻的p值都计算出来

多谢了

最佳答案

jl60156 查看完整内容

proc sql; create table have1 as select sum(n) as n, * from have group by id, year,half, g; create table have2 as select distinct * from have1 order by id, year,half, g ; quit; proc transpose data=have2 out=trans(drop=_name_); by id year half; id g; var n; run; proc sql; select distinct id, count(distinct id) into :ids separated by ' ', :idn from trans qui ...
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2015-5-26 23:21:23
proc sql;
        create table have1 as
                select sum(n) as n, *
                from have
                group by id, year,half, g;
        create table have2 as
                select  distinct *
                from have1
                        order by id, year,half, g ;
quit;

proc transpose data=have2 out=trans(drop=_name_);
        by id year half;
        id g;
        var n;
run;
proc sql;
  select distinct id, count(distinct id) into :ids separated by ' ', :idn
  from trans
quit;

%macro want();
%do id=1 %to &idn;
%let idk=%scan(&ids,&id,%str( ));

ods select nlevels;
ods output nlevels=nlev&id;
proc freq data=trans(where=(id=&idk) drop=year half) levels;
run;
ods output close;       
proc sql noprint;
  select strip(tablevar) ,strip(tablevar) into :vars separated by ' ',
                                                                                                 :varsd separated by ','
  from nlev&id
  where nnonmisslevels ne 0 and tablevar ne 'id';
quit;
%let nvar=%sysfunc(countw(&vars,' '));
data t(keep=&vars id year half);
        set trans;
    %do j=1 %to &nvar;
      %let k=%scan(&vars,&j,%str( ));
                        if missing(&k) then &k=0;
                        if half=1 then &k=-(&k);
    %end;
        where id ne &idk;
run;
proc sql;
        create table t&id as
                select sum(sum(&varsd)) as p,&idk as id,year
                from t
                group by  year
                        order by  year;
quit;
%end;
data tall;
        set %do id=1 %to &idn; t&id %end;;
run;
proc sort data=have;
        by id year;
run;

proc sort data=tall;
        by id year;
run;
data want;
        merge have(in=a) tall;
        by id year;
        if a;
run;
%mend;       

%want;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2015-5-29 10:50:04
在线等啊
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2015-5-29 21:15:05
很想帮楼主   但是我也不会啊  
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2015-5-29 23:37:36
jl60156 发表于 2015-5-29 23:27
proc sql;
        create table have1 as
                select sum(n) as n, *
非常感谢,不过显示着一些错误呢  










234
235
236
237  proc sql;
238          create table have1 as
239                  select sum(n) as n, *
240                  from have
241                  group by id, year,half, g;
NOTE: 查询要求将汇总统计量与原始的数据重新合并。
WARNING: 变量 n 已经存在于文件“WORK.HAVE1”中。
NOTE: 表 WORK.HAVE1 创建完成,有 75 行,5 列。

242          create table have2 as
243                  select  distinct *
244                  from have1
245                          order by id, year,half, g ;
NOTE: 表 WORK.HAVE2 创建完成,有 74 行,5 列。

246  quit;
NOTE: “PROCEDURE SQL”所用时间(总处理时间):
      实际时间          0.01 秒
      CPU 时间          0.01 秒


247
248  proc transpose data=have2 out=trans(drop=_name_);
249          by id year half;
250          id g;
251          var n;
252  run;

NOTE: 从数据集 WORK.HAVE2. 读取了 74 个观测
NOTE: 数据集 WORK.TRANS 有 16 个观测和 13 个变量。
NOTE: “PROCEDURE TRANSPOSE”所用时间(总处理时间):
      实际时间          0.01 秒
      CPU 时间          0.01 秒


253  proc sql;
254    select distinct id, count(distinct id) into :ids separated by ' ', :idn
255    from trans
256  quit;
NOTE: 查询要求将汇总统计量与原始的数据重新合并。
257
258  %macro want();
259  %do id=1 %to &idn;
260  %let idk=%scan(&ids,&id,%str( ));
261
262  ods select nlevels;
263  ods output nlevels=nlev&id;
264  proc freq data=trans(where=(id=&idk) drop=year half) levels;
265  run;
266  ods output close;
267  proc sql noprint;
268    select strip(tablevar) ,strip(tablevar) into :vars separated by ' ',
269                                                                                                   :varsd separated
269!  by ','
270    from nlev&id
271    where nnonmisslevels ne 0 and tablevar ne 'id';
272  quit;
273  %let nvar=%sysfunc(countw(&vars,' '));
274  data t(keep=&vars id year half);
275          set trans;
276      %do j=1 %to &nvar;
277        %let k=%scan(&vars,&j,%str( ));
278                          if missing(&k) then &k=0;
279                          if half=1 then &k=-(&k);
280      %end;
281          where id ne &idk;
282  run;
283  proc sql;
284          create table t&id as
285                  select sum(sum(&varsd)) as p,&idk as id,year
286                  from t
287                  group by  year
288                          order by  year;
289  quit;
290  %end;
291  data tall;
292          set %do id=1 %to &idn; t&id %end;;
293  run;
294  proc sort data=have;
295          by id year;
296  run;
297
298  proc sort data=tall;
299          by id year;
300  run;
301  data want;
302          merge have(in=a) tall;
303          by id year;
304          if a;
305  run;
306  %mend;
307
308  %want;
WARNING: 未创建输出“nlevels”。请确保输出对象名称、标签或路径拼写正确。
         还需确保使用了相应的过程选项来生成请求的输出对象。如,确保没有使用 NOPRINT 选项。
WARNING: 未创建输出“nlevels”。请确保输出对象名称、标签或路径拼写正确。
         还需确保使用了相应的过程选项来生成请求的输出对象。如,确保没有使用 NOPRINT 选项。
WARNING: 当前的 ODS SELECT/EXCLUDE/OUTPUT 语句被清除,因为检测到 PROC 步的结尾。
         其原因可能包括交互式过程的无终止(键入 quit; 结束过程)和不带输出的运行组。
NOTE: “PROCEDURE SQL”所用时间(总处理时间):
      实际时间          0.06 秒
      CPU 时间          0.06 秒



NOTE: 从数据集 WORK.TRANS. 读取了 4 个观测
      WHERE id=1;
NOTE: “PROCEDURE FREQ”所用时间(总处理时间):
      实际时间          0.11 秒
      CPU 时间          0.03 秒


ERROR: 文件“WORK.NLEV1.DATA”不存在。
NOTE: 由于出错,SAS 系统停止处理该步。
NOTE: “PROCEDURE SQL”所用时间(总处理时间):
      实际时间          0.00 秒
      CPU 时间          0.01 秒

WARNING: 没有解析符号引用 VARS。


NOTE: 由调用宏“WANT”生成行。
4     data t(keep=&vars id year half);         set trans;
                  -
                  214
                  23
WARNING: 没有解析符号引用 VARS。
WARNING: 没有解析符号引用 VARS。
WARNING: 没有解析符号引用 VARS。
NOTE: 由宏变量 K 生成行。
1    &vars
     -
     22
WARNING: 没有解析符号引用 VARS。
NOTE: 由宏变量 K 生成行。
1     &vars
      -
      180
WARNING: 没有解析符号引用 VARS。
NOTE: 由宏变量 K 生成行。
1     &vars
      -
      180
WARNING: 没有解析符号引用 VARS。
WARNING: 没有解析符号引用 VARS。

ERROR 214-322: 变量名 & 无效。

ERROR 23-7: 对于“KEEP”选项值无效。

ERROR 22-322: 语法错误,期望下列之一: 名称, 带引号的字符串, 数值常数, 日期时间常数, 缺失值, INPUT, PUT.

ERROR 180-322: 语句无效或未按正确顺序使用。

NOTE: 由于出错,SAS 系统停止处理该步。
NOTE: “DATA 语句”所用时间(总处理时间):
      实际时间          0.05 秒
      CPU 时间          0.04 秒



NOTE: 由调用宏“WANT”生成行。
8                                                      create table t&id as                 select sum(sum(&varsd)) as
                                                                                                           -
                                                                                                           22
8  !  p,&idk as id,year                 from t                 group by  year                         order by  year;
8  ! quit;
WARNING: 没有解析符号引用 VARSD。
ERROR 22-322: 语法错误,期望下列之一: 名称, 带引号的字符串, 数值常数, 日期时间常数, 缺失值, ), BTRIM, INPUT, PUT,
              SUBSTRING, USER.

NOTE: 由于出错,SAS 系统停止处理该步。
NOTE: “PROCEDURE SQL”所用时间(总处理时间):
      实际时间          0.01 秒
      CPU 时间          0.01 秒



NOTE: 数据集 WORK.NLEV2 有 11 个观测和 5 个变量。
NOTE: 从数据集 WORK.TRANS. 读取了 6 个观测
      WHERE id=2;
NOTE: “PROCEDURE FREQ”所用时间(总处理时间):
      实际时间          0.01 秒
      CPU 时间          0.01 秒


NOTE: “PROCEDURE SQL”所用时间(总处理时间):
      实际时间          0.00 秒
      CPU 时间          0.00 秒



NOTE: 从数据集 WORK.TRANS. 读取了 10 个观测
      WHERE id not = 2;
NOTE: 数据集 WORK.T 有 10 个观测和 10 个变量。
NOTE: “DATA 语句”所用时间(总处理时间):
      实际时间          0.01 秒
      CPU 时间          0.01 秒


NOTE: 表 WORK.T2 创建完成,有 3 行,3 列。

NOTE: “PROCEDURE SQL”所用时间(总处理时间):
      实际时间          0.01 秒
      CPU 时间          0.01 秒



NOTE: 数据集 WORK.NLEV3 有 11 个观测和 5 个变量。
NOTE: 从数据集 WORK.TRANS. 读取了 6 个观测
      WHERE id=3;
NOTE: “PROCEDURE FREQ”所用时间(总处理时间):
      实际时间          0.01 秒
      CPU 时间          0.01 秒


NOTE: “PROCEDURE SQL”所用时间(总处理时间):
      实际时间          0.00 秒
      CPU 时间          0.00 秒



NOTE: 从数据集 WORK.TRANS. 读取了 10 个观测
      WHERE id not = 3;
NOTE: 数据集 WORK.T 有 10 个观测和 12 个变量。
NOTE: “DATA 语句”所用时间(总处理时间):
      实际时间          0.00 秒
      CPU 时间          0.00 秒


NOTE: 表 WORK.T3 创建完成,有 3 行,3 列。

NOTE: “PROCEDURE SQL”所用时间(总处理时间):
      实际时间          0.01 秒
      CPU 时间          0.01 秒


ERROR: 文件“WORK.T1.DATA”不存在。

NOTE: 由于出错,SAS 系统停止处理该步。
WARNING: 数据集 WORK.TALL 可能不完整。该步停止时,共有 0 个观测和 3 个变量。
WARNING: 数据集 WORK.TALL 由于该步已停止,而没有被替换。
NOTE: “DATA 语句”所用时间(总处理时间):
      实际时间          0.01 秒
      CPU 时间          0.01 秒




NOTE: 从数据集 WORK.HAVE. 读取了 75 个观测
NOTE: 数据集 WORK.HAVE 有 75 个观测和 5 个变量。
NOTE: “PROCEDURE SORT”所用时间(总处理时间):
      实际时间          0.01 秒
      CPU 时间          0.01 秒



NOTE: 输入数据集为空。
NOTE: 数据集 WORK.TALL 有 0 个观测和 3 个变量。
NOTE: “PROCEDURE SORT”所用时间(总处理时间):
      实际时间          0.01 秒
      CPU 时间          0.01 秒



NOTE: 从数据集 WORK.HAVE. 读取了 75 个观测
NOTE: 从数据集 WORK.TALL. 读取了 0 个观测
NOTE: 数据集 WORK.WANT 有 75 个观测和 6 个变量。
NOTE: “DATA 语句”所用时间(总处理时间):
      实际时间          0.01 秒
      CPU 时间          0.00 秒



二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2015-5-30 00:30:44
小鳄鱼a 发表于 2015-5-29 23:37
非常感谢,不过显示着一些错误呢
try again

proc sql;
        create table have1 as
                select sum(n) as n, *
                from have
                group by id, year,half, g;
        create table have2 as
                select  distinct *
                from have1
                        order by id, year,half, g ;
quit;

proc transpose data=have2 out=trans(drop=_name_);
        by id year half;
        id g;
        var n;
run;
proc sql;
  select distinct id, count(distinct id) into :ids separated by ' ', :idn
  from trans
quit;
ods output nlevels=dummy;
proc freq data=trans( drop=year half) levels;
run;
%macro want();
%do id=1 %to &idn;
%let idk=%scan(&ids,&id,%str( ));

ods select nlevels;
ods output nlevels=nlev&id;
proc freq data=trans(where=(id=&idk) drop=year half) levels;
run;
ods output close;        
proc sql noprint;
  select strip(tablevar) ,strip(tablevar) into :vars separated by ' ',
                                                                                                 :varsd separated by ','
  from nlev&id
  where nnonmisslevels ne 0 and tablevar ne 'id';
quit;
%let nvar=%sysfunc(countw(&vars,' '));
data t(keep=&vars id year half);
        set trans;
    %do j=1 %to &nvar;
      %let k=%scan(&vars,&j,%str( ));
                        if missing(&k) then &k=0;
                        if half=1 then &k=-(&k);
    %end;
        where id ne &idk;
run;
proc sql;
        create table t&id as
                select sum(sum(&varsd)) as p,&idk as id,year
                from t
                group by  year
                        order by  year;
quit;
%end;
data tall;
        set %do id=1 %to &idn; t&id %end;;
run;
proc sort data=have;
        by id year;
run;

proc sort data=tall;
        by id year;
run;
data want;
        merge have(in=a) tall;
        by id year;
        if a;
run;
%mend;        

%want;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群