楼主: X-power
5779 13

分组后进行有条件的累加 [推广有奖]

  • 1关注
  • 0粉丝

大专生

70%

还不是VIP/贵宾

-

威望
0
论坛币
63 个
通用积分
0
学术水平
0 点
热心指数
2 点
信用等级
0 点
经验
493 点
帖子
70
精华
0
在线时间
30 小时
注册时间
2013-8-22
最后登录
2017-9-18

楼主
X-power 发表于 2016-10-23 00:41:06 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
程序
data test;
input name$  time1 yymmdd10. score;
datalines;
a 2016-09-02 35
a 2015-02-17 90
b 2013-07-08 40
a 2016-08-05 89
b 2014-06-02 70
;
run;

proc sort data = test;
by name time;
run;
data test;
set test;
by name;
if first.name then sum = score;
else sum + score;
run;

这个程序能够实现对name相同的变量 score进行求和
我现在的问题是如何能够有条件的求和,比如加入时间的约束,name相同的观测中,只把距离第一个观测的时间小于一年的观测进行score求和 而不是像现在代码里那样所有都求和


二维码

扫码加我 拉你入群

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

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

关键词:score First Lines Input name 程序 如何

沙发
一线天56 发表于 2016-10-23 09:37:34
我的思路是先创建满足条件的表格,再相加。
data test;
input name$  time yymmdd10. score;
datalines;
a 2016-09-02 35
a 2015-02-17 90
b 2013-07-08 40
a 2016-08-05 89
b 2014-06-02 70
;
run;
proc sort data = test;
by name time;
run;
data test1;
set test;
by name;
if first.name then output;
run;
proc sql noprint;
create table test2 as
select test.*
from test,test1
where  test.name=test1.name and test.time<test1.time+365;
quit;
proc sort data = test2;
by name time;
run;
data test2;
set test2;
by name;
if first.name then sum = score;
else sum + score;
run;

藤椅
l1i2n3i4n5g 在职认证  发表于 2016-10-23 10:04:46
else sum+score;
改成
else if time-first.time<=365 then sum+score;
试试看

板凳
X-power 发表于 2016-10-23 10:05:38
小白求大神解答

报纸
X-power 发表于 2016-10-23 10:06:00
一线天56 发表于 2016-10-23 09:37
我的思路是先创建满足条件的表格,再相加。
data test;
input name$  time yymmdd10. score;
X-power 未认证  发表于 1 秒前 |只看作者





大多数语句都能看得懂 感觉是个很好的思路 能稍微解释一下sql那块table语句吗 谢谢!

地板
X-power 发表于 2016-10-23 10:07:08
l1i2n3i4n5g 发表于 2016-10-23 10:04
else sum+score;
改成
else if time-first.time
这个我试过 不行 因为是按照name sort的 所以first.name会显示未初始化 本来想这样的语句会最简单

7
X-power 发表于 2016-10-23 10:07:47
一线天56 发表于 2016-10-23 09:37
我的思路是先创建满足条件的表格,再相加。
data test;
input name$  time yymmdd10. score;
大多数语句都能看得懂 感觉是个很好的思路 能稍微解释一下sql那块table语句吗 谢谢!

8
l1i2n3i4n5g 在职认证  发表于 2016-10-23 10:15:42
X-power 发表于 2016-10-23 10:07
这个我试过 不行 因为是按照name sort的 所以first.name会显示未初始化 本来想这样的语句会最简单
另外
by  name;
改成
by name time;
first.time要赋值给一个retain变量

9
X-power 发表于 2016-10-23 11:17:19
data test;
input name$  time yymmdd10. score;
datalines;
a 2017-09-02 35
a 2016-02-17 90
b 2013-07-08 40
a 2016-08-05 89
b 2014-06-02 70
;
run;
proc sort data = test;
by name time;
run;

data test;
set test;
by name;
if first.name then firsttime = time;
else firsttime + 0 ;
if first.name then sum = score;
else if time - firsttime le 360 then sum + score;
else sum = 0;
run;

参照l1i2n3i4n5g的思路 写了个这个 无法直接引用每个观测的第一个时间的话就自己加入了一个变量来保存 这样可以实现效果
不知道是否有更为简便的代码 刚刚简化成这样了 已经可以较好使用也不麻烦 不需要生成新的数据集
另外 感谢一线天56给出的思路 让我知道了table的用法 以后可以用于别的功能实现 同时是第一个给出解决方法的人 让我大石落地 至少不用担心无法实现了


总结:会的功能不一定多 想法算法很重要 最后自己琢磨出来的语句没有用到任何新的内容 真是感受到了代码的魅力!

10
X-power 发表于 2016-10-23 11:19:14
l1i2n3i4n5g 发表于 2016-10-23 10:15
另外
by  name;
改成
感觉我最后写的代码和你这个想法很接近了 不知是否有别的办法能够连新的变量都不需要生成

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-7 21:11