楼主: 阿娜塔哇
1634 6

[有偿编程] SAS分组问题 [推广有奖]

  • 0关注
  • 1粉丝

已卖:57份资源

讲师

63%

还不是VIP/贵宾

-

威望
0
论坛币
19268 个
通用积分
5.8285
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
2523 点
帖子
113
精华
0
在线时间
956 小时
注册时间
2015-9-20
最后登录
2026-2-10

楼主
阿娜塔哇 学生认证  发表于 2022-7-25 14:45:00 |AI写论文
150论坛币
数据样式如下:ID,time和Num是原始的数据,需要根据这三个变量生成g这一列,第一行g取值为1,从第二行开始,如果Num与上一行的取值相同,那么g取值不变,否则g取值加1,分ID进行处理。利用SAS如何实现这一需求?还有一个问题,如果需要定位到变量某一行的取值,要如何处理,比如说想定位到每一个ID中Time的第t个取值Timei,t,这种可以在SAS中实现吗?

IDTimeNumg

1

1

1

1

1

2

0

2

1

3

0

2

1

4

1

3

1

5

1

3

1

6

1

3

1

7

1

3

1

8

1

3

1

9

0

4

1

10

0

4

1

11

0

4

1

12

0

4

1

13

1

5

1

14

1

5

1

15

1

5

1

16

1

5

2

1

1

1

2

2

1

1

2

3

0

2

2

4

0

2

2

5

0

2

2

6

1

3

2

7

1

3

2

8

1

3




最佳答案

whymath 查看完整内容

第1题: 第2题并没有说清,当前数据集的time变量就是按从1开始的自然数递增的,想要选取time的第i个取值,仅凭逻辑推理就知道结果为i,何须编程?如我理解有误,请按第1题的做法给出结果示例与解释。
关键词:time menu 变量生成 如何实现 IME

回帖推荐

沙发
whymath 发表于 2022-7-25 14:45:01
第1题:
  1. data test;
  2. input ID$ Time Num@@;
  3. cards;
  4. 1 1 1
  5. 1 2 0
  6. 1 3 0
  7. 1 4 1
  8. 1 5 1
  9. 1 6 1
  10. 1 7 1
  11. 1 8 1
  12. 1 9 0
  13. 1 10 0
  14. 1 11 0
  15. 1 12 0
  16. 1 13 1
  17. 1 14 1
  18. 1 15 1
  19. 1 16 1
  20. 2 1 1
  21. 2 2 1
  22. 2 3 0
  23. 2 4 0
  24. 2 5 0
  25. 2 6 1
  26. 2 7 1
  27. 2 8 1
  28. ;
  29. run;

  30. data want;
  31.   set test;
  32.   if id^=lag(id) then g=1;
  33.   else g+num^=lag(num);
  34. run;
复制代码

第2题并没有说清,当前数据集的time变量就是按从1开始的自然数递增的,想要选取time的第i个取值,仅凭逻辑推理就知道结果为i,何须编程?如我理解有误,请按第1题的做法给出结果示例与解释。

藤椅
橙红的果士 学生认证  发表于 2022-7-26 16:08:15
  1. data test;
  2.         input ID Time Num@@;
  3. cards;
  4. 1 1 1
  5. 1 2 0
  6. 1 3 0
  7. 1 4 1
  8. 1 5 1
  9. 1 6 1
  10. 1 7 1
  11. 1 8 1
  12. 1 9 0
  13. 1 10 0
  14. 1 11 0
  15. 1 12 0
  16. 1 13 1
  17. 1 14 1
  18. 1 15 1
  19. 1 16 1
  20. 2 1 1
  21. 2 2 1
  22. 2 3 0
  23. 2 4 0
  24. 2 5 0
  25. 2 6 1
  26. 2 7 1
  27. 2 8 1
  28. ;
  29. run;

  30. proc sort data=test;
  31.   by ID Time;
  32. run;

  33. data test1;
  34.         set test;
  35.         retain num0;
  36.         num0=lag(num);
  37. run;

  38. data test2;
  39.         set test1;
  40.         by ID;
  41.         if first.ID then num1=.; else num1=num0;
  42. run;

  43. data test3;
  44.         set test2;
  45.         by ID;
  46.         retain g;
  47.         if first.ID then g=1;
  48.         else if num^=num1 then do; g=g+1; end;
  49.         else if num=num1 then do; g=g; end;
  50. run;
复制代码
已有 1 人评分经验 收起 理由
eijuhz + 40 精彩帖子

总评分: 经验 + 40   查看全部评分

板凳
橙红的果士 学生认证  发表于 2022-7-26 16:12:06
对于第二个问题,我猜你是想找出每个ID下的NUM变化的所有TIME的值,这个是可以实现的

报纸
阿娜塔哇 学生认证  发表于 2022-7-29 12:14:47
whymath 发表于 2022-7-25 14:45
第1题:

第2题并没有说清,当前数据集的time变量就是按从1开始的自然数递增的,想要选取time的第i个取值 ...
这个的实现逻辑可不可以讲一下

地板
阿娜塔哇 学生认证  发表于 2022-8-6 13:25:52

7
whymath 发表于 2023-8-8 11:11:04
阿娜塔哇 发表于 2022-7-29 12:14
这个的实现逻辑可不可以讲一下
核心代码是:
  1. if id^=lag(id) then g=1;
  2. else g+num^=lag(num);
复制代码
逻辑如下:
1. 对当前 ID 的第一条观测,即满足 id^=lag(id) 的观测,将变量 g 赋初始值 1;
2. 对当前 ID 的其它观测,当 num 发生变化时,即满足 num^=lag(num) 时,将变量 g 的值增加 1;

这里利用了一些特性,使得程序简短,但也要求更深刻的理解,实际是否这样使用,可以自行评估。
1. var^=lag(var):该表达式判断变量在当前观测和上一条观测的值是否相同,相同返回1,不同返回0;
2. g+var^=lag(var):该表达式中,+运算优先级最高,但它是从右向左进行评估,因此,首先评估右侧这个比较运算表达式,返回 0 或 1,然后式子转化为 g+0 或 g+1;
3. g+0 或 g+1:这是 SAS 中独特的累加赋值运算,注意这是一个赋值表达式,但省去了=。此时,变量 g 的值将不会被 PDV 的迭代初始化为缺失值,也就是说,表达式 g+1 等价于:retain g 0; g=g+1;

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

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