全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
1429 11
2024-08-18
悬赏 88 个论坛币 已解决
离开学校好多年了,最近一年SAS用的不多,有些生疏了。这个问题应该不难解决。

请看附件EXCEL表格里的样本数据就是我想要的结果格式存放在理想结果的tab里。那个原始数据tab有几万甚至几十万行,消减一下可以看出数据长什么样。
Sample Data.xlsx
大小:(11.16 KB)

 马上下载



我弄的时候遇到一个问题就是每个产品product_name 不是细节归纳起来后都会有Bad 或者 Good 的评级, 我想让每个产品按照Bad, Good 顺序排列,然后把它们的成本差计算在Bad 的那一行里,这样Good 的那一行就是空格。还有如果一个产品只有Good 或者只有Bad 那就没法对比,这样就把它们的成本查的行里设置空格。但是我计算后每行都会有数据不知道怎么把Bad_Good_Diff 的那一列变成我这里说的想要的结果。

这个Bad_Good_Diff 目的是把Bad 总销售恒本逐步转移到Good 评级里,因为每个product_name 如果是被评为Good 后一般销售总成本要低于Bad。 这2023和2024 年的数据可以验证我说的,虽然有少数评级Good 的总成本要高于Bad 的同一个产品。 但如果你看Cost Per Unit 就是每个单元的成本还是Good要低于Bad。

一旦找出最佳答案我会很快支付金币作为奖赏。谢谢支持。




最佳答案

二维码

扫码加我 拉你入群

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

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

全部回复
2024-8-18 11:33:23
复制代码
[img][/img]
二维码

扫码加我 拉你入群

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

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

2024-8-19 22:19:14

proc import datafile="xxxxxxxxx\TEMP.XLSX"
    out=aa1;
run;

data a2;
  set aa1;
  name=input(substr(product_name,9,2),best.);
  if strip(lowcase(quality_indicator))="good" then subcat=1;
  if strip(lowcase(quality_indicator))="bad" then subcat=2;
  cost=unit_count;  *****seen unit_count as the cost***;
/*  input(cost_amount,??best.);*/
run;
proc sort data=a2;by year name subcat product_details;run;

****get product_name for all bad/good***;
data a3;
  set a2;
  by year name subcat product_details;
  if first.subcat then sum=cost;
    else sum+cost;
  if last.subcat;
run;
proc sort data=a3;by year name subcat product_details;run;

proc transpose data=a3 out=a4 prefix=cost;
  by year name;
  id subcat;
  var sum;
run;

data a5;
  set a4;
  if nmiss(cost1,cost2)=0 then differ=cost2-cost1;**bad minus good***;
  subcat=2;
  keep year name differ subcat;
run;
proc sort data=a5;by year name subcat;run;
proc sort data=a3;by year name subcat;run;

data final;
  merge a3(in=a) a5(in=b);
  by year name subcat;
  if a;
  Bad_Good_Diff=differ;
  keep  year name subcat product_details Bad_Good_Diff
       product_name quality_indicator;
run;         
使用给的数据集,code可以直接copy。
可以得到如上结果
二维码

扫码加我 拉你入群

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

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

2024-8-20 22:55:15
逸水清尘1 发表于 2024-8-19 22:19
proc import datafile="xxxxxxxxx\TEMP.XLSX"
    out=aa1;
run;
我测试下明天给答复。谢谢帮助。
二维码

扫码加我 拉你入群

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

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

2024-8-21 06:58:49
逸水清尘1 发表于 2024-8-19 22:20
[/img]
我的问题都总结在下面的回贴中。
二维码

扫码加我 拉你入群

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

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

2024-8-21 07:34:33
谢谢解答, 请跟进:问题好像出在这一行:proc sort data=a2;by year name subcat product_details;run; 你是不是忘了加 nodup 因为很多产品在加入这个新的subcat 变量后都出现重复的行数。 这个问题解决后, 我不明白下边这段能跑出数据:
data a3;
  set a2;
  by year name subcat product_details;
  if first.subcat then sum=cost;
    else sum+cost; 这里应该是 sum=sum+cost 吧?
  if last.subcat;
run;
proc sort data=a3;by year name subcat product_details;run;

但是当你用proc transpose 的调转数据表后产生的cost2 和 cost1 可以计算diff 啊。我是它们只有一个有数据的情况下不计算diff 但是如果两个都有可以对比一个产品的优劣成本时候,就该有diff 的数值。 这个下面 id subcat 的作用是什么?

proc transpose data=a3 out=a4 prefix=cost;
  by year name;
  id subcat;
  var sum;
run;

这一步之后产生的 a5 dataset 的结果里的diff 都是 . 不该这样把?

这个subcat 是该控制成2 或者是坏的产品的成本与好的产品的成本的差值显示在每个产品的差的成本的总量那一行,但是为啥前面有的产品的cost2 and cost1 都有数据时候,计算的diff 也显示. ?
二维码

扫码加我 拉你入群

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

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

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群