楼主: 小鳄鱼a
7672 17

求助各位高手啊 [推广有奖]

  • 6关注
  • 10粉丝

已卖:280份资源

学科带头人

3%

还不是VIP/贵宾

-

威望
0
论坛币
125 个
通用积分
0.0040
学术水平
40 点
热心指数
45 点
信用等级
43 点
经验
32801 点
帖子
1185
精华
0
在线时间
1539 小时
注册时间
2009-7-16
最后登录
2018-10-5

楼主
小鳄鱼a 发表于 2015-5-26 23:21:22 |AI写论文
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 ...

沙发
jl60156 发表于 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;
已有 2 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
admin_kefu + 50 热心帮助其他会员
小鳄鱼a + 5 + 5 + 5 精彩帖子

总评分: 论坛币 + 50  学术水平 + 5  热心指数 + 5  信用等级 + 5   查看全部评分

藤椅
小鳄鱼a 发表于 2015-5-29 10:50:04
在线等啊

板凳
akalius 学生认证  发表于 2015-5-29 21:15:05
很想帮楼主   但是我也不会啊  

报纸
小鳄鱼a 发表于 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 秒



地板
jl60156 发表于 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;
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
小鳄鱼a + 5 + 5 + 5 + 5 精彩帖子

总评分: 论坛币 + 5  学术水平 + 5  热心指数 + 5  信用等级 + 5   查看全部评分

7
小鳄鱼a 发表于 2015-5-30 08:02:28
jl60156 发表于 2015-5-30 00:30
try again

proc sql;
可能我表述的意思不够清晰。

结果显示每个id每年的值都一样,但是应该每个时期的值,也就是每半年的值一样。half是半年的意思,1代表上半年,2代表下半年。
id=1从1997年上半年到1998年下半年。
id=2从1996年上半年到1998年下半年。
id=3从1997年上半年到1999年下半年。

我说的更加准确一些
p值得计算思路是,看看其他的id在t+1时刻对该id在t时期所拥有g的有多少增减,以此来作为id在t+1时刻的p值。t代表半年的。从这个思路来讲,id1,id3对于id2在1996年下半年是有影响的,以此来作为id2在1997年上半年的p值。
因为id3的时间段一直到1999年下半年,而id1和id2到1998年下半年,所以id3对于id2和id1在1998年下半年的p肯定有影响,但是id1和id2对id3在1998年下年的p就没有影响了,因为它们没有1999年上半年的数值。

麻烦您了

8
小鳄鱼a 发表于 2015-5-30 08:04:53
jl60156 发表于 2015-5-30 00:30
try again

proc sql;
换句话而讲   我不是用year作为t时期的间隔    而是用year half作为时期间隔

9
jl60156 发表于 2015-6-1 10:04:32
不知道是不是你要的,最好给个例子.比如id=1的所有相对应p值相怎么算


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;
data have2;
        set have2;
        t=year*10+half*5;
run;

proc transpose data=have2 out=trans(drop=_name_);
        by id t;
        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 levels;
run;
%macro want();
%do id=1 %to &idn;
%let idk=%scan(&ids,&id,%str( ));

proc sql;
  select distinct t, count(distinct t) into :ts separated by ' ', :tn
  from trans
  where id=&idk;
quit;
%do t=1 %to &tn;
%let tk=%scan(&ts,&t,%str( ));
ods select nlevels;
ods output nlevels=nlev&id&t;
proc freq data=trans(where=(id=&idk and t=&tk) ) levels;
run;
ods output close;        
proc sql noprint;
  select strip(tablevar) ,strip(tablevar) into :vars separated by ' ',
                                                                                                 :varsd separated by ','
  from nlev&id&t
  where nnonmisslevels ne 0 and tablevar not in ('id','t');
quit;
%let nvar=%sysfunc(countw(&vars,' '));
data t(keep=&vars id t);
        set trans;
    %do j=1 %to &nvar;
      %let k=%scan(&vars,&j,%str( ));
                        if missing(&k) then &k=0;
                        if t=&tk then &k=-(&k);
    %end;
    where id ne &idk and &tk<=t<=%eval(&tk+5);
run;
proc sql;
        create table t&t as
                select sum(sum(&varsd)) as p,&idk as id,%eval(&tk+5) as t
                from t;
quit;
%end;
data tid&id;
        set %do t=1 %to &tn; t&t %end;;
run;
%end;
data tall;
        set %do id=1 %to &idn;  tid&id %end;;
                year=floor(t/10)-(mod(t,10)=0);
                half=mod(t/5,2)+(mod(t/5,2)=0)*2;
run;
proc sort data=have;
        by id year half;
run;

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

%want;
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
小鳄鱼a + 5 + 5 + 5 + 5 精彩帖子

总评分: 论坛币 + 5  学术水平 + 5  热心指数 + 5  信用等级 + 5   查看全部评分

10
小鳄鱼a 发表于 2015-6-1 15:01:28
jl60156 发表于 2015-6-1 10:04
不知道是不是你要的,最好给个例子.比如id=1的所有相对应p值相怎么算
您好   请看看sheet2  ,我回复有个地方讲错了   ,表中也重新做了说明 , 这个表更加简单直观一些  

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-2-17 10:48