楼主: cchen59
1383 7

SAS 求助-写出code者赠予50个论坛币,谢谢大家! [推广有奖]

  • 0关注
  • 0粉丝

高中生

2%

还不是VIP/贵宾

-

威望
0
论坛币
2946 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
71 点
帖子
10
精华
0
在线时间
27 小时
注册时间
2011-1-3
最后登录
2015-7-12

楼主
cchen59 发表于 2014-12-18 12:58:14 |AI写论文
50论坛币
求助SAS 编程:

如何将多个重复的observation合并成一个observation? 最终结果return为下:

ID   Rev1 Rev2 Rev3 Rev4
001   4       5      Null   10
002   19     20     Null   35
003   Null   45     Null   Null

以下是原数据(例子)

Data test;
Input Id$ Rev1$ Rev2$ Rev3$ Rev4$;
Datalines;
001 Null 5 Null Null
001 4 Null Null Null
001 Null Null Null 10
002 19 Null Null Null
002 Null 20 Null Null
002 Null Null Null 35
003 Null 45 Null Null
;
Run;

谢谢,欢迎大家讨论,写出code者赠予50个论坛币,谢谢大家!


关键词:code ODE COD 论坛币 observation return 如何

回帖推荐

huzhenghui 发表于4楼  查看完整内容

ifc(条件,a,b)是选择函数,条件成立返回a,否则返回b 最后的if相当于sql语句中的where

沙发
Tigflanker 发表于 2014-12-18 12:58:15
  1. Data test;
  2. Input Id$ Rev1$ Rev2$ Rev3$ Rev4$;
  3. Datalines;
  4. 001 Null 5 Null Null
  5. 001 4 Null Null Null
  6. 001 Null Null Null 10
  7. 002 19 Null Null Null
  8. 002 Null 20 Null Null
  9. 002 Null Null Null 35
  10. 003 Null 45 Null Null
  11. ;
  12. Run;

  13. data want(drop = temp:);
  14.   set test;
  15.   by id;

  16.   array Rev Rev1 - Rev4;
  17.   array temp $50. temp1 - temp4;
  18.   retain temp;

  19.   do over Rev;
  20.     temp = ifc(cats(Rev) ~= 'Null' or first.id,Rev,temp);
  21.     if last.id then Rev = temp;
  22.   end;

  23.   if last.id;
  24. run;
复制代码

藤椅
cchen59 发表于 2014-12-18 13:36:44
Tigflanker 发表于 2014-12-18 13:10
谢谢了,我对您下面这个部分不是很懂,能否解释一下?

temp = ifc(cats(Rev) ~= 'Null' or first.id,Rev,temp);
    if last.id then Rev = temp;


另外求助一下,对于First & Last indicator 例如:
Data ex13c;                           
set ex13;
By ID;
If First.ID then count=0;
        count+1;
Run;

和下面这个code对比,最后结果是下一组数据的observation少于前面,您知道是为什么吗? 谢谢
Data ex13c;                           
set ex13;
By ID;
If First.ID then count=0;
        count+1;
If Last.ID;
Run;

板凳
huzhenghui 发表于 2014-12-18 15:38:52
cchen59 发表于 2014-12-18 13:36
谢谢了,我对您下面这个部分不是很懂,能否解释一下?

temp = ifc(cats(Rev) ~= 'Null' or first.i ...
ifc(条件,a,b)是选择函数,条件成立返回a,否则返回b

最后的if相当于sql语句中的where

报纸
Tigflanker 发表于 2014-12-19 11:51:56
cchen59 发表于 2014-12-18 13:36
谢谢了,我对您下面这个部分不是很懂,能否解释一下?

temp = ifc(cats(Rev) ~= 'Null' or first.i ...
if last.xxx;
是只保留本分组的最后一条观测,当然会少很多的。

temp = ifc(cats(Rev) ~= 'Null' or first.id,Rev,temp);
    if last.id then Rev = temp;
temp数组是为了做一个交换值的数组,该数组被Rev原值赋值的条件为:id分组的第一条观测 或 满足不为Null的时候。
第二句是在last,也就是id组最后一条时,把temp的值拿回。

地板
cchen59 发表于 2014-12-19 13:19:14
Tigflanker 发表于 2014-12-19 11:51
if last.xxx;
是只保留本分组的最后一条观测,当然会少很多的。
谢谢,逻辑很精彩,慢慢体会中...

7
teqel 发表于 2014-12-19 15:43:08
捣个乱:)
  1. Data test;
  2. Input IdRev$ Rev1$ Rev2$ Rev3 $ Rev4$;
  3. Datalines;
  4. 001 Null 5 Null Null
  5. 001 4 Null Null Null
  6. 001 Null Null Null 10
  7. 002 19 Null Null Null
  8. 002 Null 20 Null Null
  9. 002 Null Null Null 35
  10. 003 Null 45 Null Null
  11. ;
  12. Run;

  13. proc sql;
  14. create table want as
  15. select IdRev, min(Rev1) as Rev11, min(Rev2) as Rev22, min(Rev3) as Rev33, min(Rev4) as Rev44
  16. from test
  17. group by IdRev;
  18. quit;
复制代码
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
Tigflanker + 5 + 3 + 3 + 3 好的思路

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

8
teqel 发表于 2014-12-19 16:37:09
teqel 发表于 2014-12-19 15:43
捣个乱:)
多谢。这是投机取巧。上次那个用update的才是真的高明

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-5 19:01