楼主: 阿娜塔哇
1080 5

[有偿编程] SAS读取数据 [推广有奖]

  • 0关注
  • 1粉丝

已卖:57份资源

讲师

63%

还不是VIP/贵宾

-

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

楼主
阿娜塔哇 学生认证  发表于 2024-10-31 21:52:36 |AI写论文
1000论坛币
有一个需求求助一下,原始数据是这样的,包含了姓名,购买的时间和购买金额三个指标,如果同一个人有多次购买记录,那么新的购买记录会在下一行,并且姓名信息是省略了的,现在要求只用1个data步,读取数据,并且只保留最后一次的购买日期,同时把所有的消费金额加总,计算2023/12/31距离最后一次购买日期的时间差,数据的样式和输出结果样式我放下面,这个怎么用1个data步就实现出来,恳请大神帮忙。

输入数据的格式
12345678901234567890123456789012345678901234567890
"Lang Yu" 1/Aug/2023 100
"Tian Hui" 15/Sep/2023 200
      10/Sep/2023 400
"Bai Yun"  3/Jun/2023 150
  20/Jul/2023 200
1/Dec/2023 230
15/Oct/2023 160

SAS导出的格式
Name     Last Date   Num   Total     Days to 31/Dec/2023
Lang Yu      23223         1     100                                152
Bai Yun       23268         2     600                                107
Bai Yun       23345         4     740                                  30

关键词:读取数据 data步 Total Data lang

沙发
ovette 发表于 2024-11-5 15:35:32
data raw0;
retain name lastdate num total  days;

input name0 $1-11 Date$12-23  Cost ;
date0=input(upcase(compress(date,'/')),date9.);

retain name num total lastdate;
if ^missing(name0) then do;
  name=name0;
  num=_n_;
  total=cost;
  lastdate=date0;
end;
else if missing(name0) then do;
  name0=name;
  num=num;
  total=total+cost;
  if date0>lastdate then lastdate=date0;
  else date0=lastdate;
end;
name=compress(name,'"');
days='31DEC2023'd-lastdate;

keep name lastdate num total  days;
cards;
"Lang Yu"  1/Aug/2023  100
"Tian Hui" 15/Sep/2023 200
           10/Sep/2023 400
"Bai Yun"  3/Jun/2023  150
           20/Jul/2023 200
           1/Dec/2023  230
           15/Oct/2023 160
;
proc sort;by num descending lastdate descending total;
proc sort nodupkey;by num;
run;

藤椅
ovette 发表于 2024-11-5 15:46:37
ovette 发表于 2024-11-5 15:35
data raw0;
retain name lastdate num total  days;
input语句 其中name0 和date都是字符型,要加美元符号,不知道为什么平台没有显示出

板凳
mmpjj 发表于 2024-12-13 15:24:22
解读一下一楼的逻辑,是合理的,通过retain语句,
第一步先补齐name, retain name1;if name ne "" then name1=name;这样全部记录有名字的信息了。
第二步计算累加金额,也可以通过retain 语句, retain sum; if name ne "" then sum=income per day; else sum=sum+income per day;这样得到了每个人的总和。
第三步计算2023/12/31距离最后一次购买日期的时间差,先全部的日期中得到最大的 retain date1 ; if date1<date(数值型的) then date1=date;
然后计算时间差day="2023-12-31"dt-date; 得到了最后的时间点和2023-12-31的之间的天数。
为了乱序最后可以加个ord=_n_; 这样sort by name1 ord就方便只output每个人的最后一条。


报纸
whymath 发表于 2024-12-18 17:39:28
两个数据步:
  1. data have;
  2.   input dummy $42.;

  3.   retain name;
  4.   if dummy=:'"' then name=substr(dummy,2,find(substr(dummy,2),'"')-1);
  5.   date=input(scan(dummy,-2,' '),date11.);
  6.   cost=input(scan(dummy,-1,' '),8.);

  7.   datalines;
  8. "Lang Yu" 1/Aug/2023 100
  9. "Tian Hui" 15/Sep/2023 200
  10. 10/Sep/2023 400
  11. "Bai Yun"  3/Jun/2023 150
  12. 20/Jul/2023 200
  13. 1/Dec/2023 230
  14. 15/Oct/2023 160
  15. ;
  16. run;

  17. data want;
复制代码


查看我的精华帖:免费的 SAS 软件

地板
reduce_fat 发表于 2025-2-8 10:24:37
ovette 发表于 2024-11-5 15:35
data raw0;
retain name lastdate num total  days;
能否帮忙解决一下这个数据处理问题?  https://bbs.pinggu.org/thread-13985353-1-1.html 谢谢。

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

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