楼主: reduce_fat
1625 11

[问答] SAS表格排序整合问题,悬赏金币找高手解答! [推广有奖]

荣誉版主

海外论坛首席管理员

已卖:18511份资源

泰斗

28%

还不是VIP/贵宾

-

TA的文库  其他...

海外原创经济论文和写作技巧

威望
11
论坛币
3591317 个
通用积分
34055.2893
学术水平
6834 点
热心指数
7193 点
信用等级
6665 点
经验
1830 点
帖子
12424
精华
78
在线时间
1974 小时
注册时间
2011-6-13
最后登录
2025-10-23

一级伯乐勋章 初级热心勋章 初级学术勋章 中级热心勋章 中级学术勋章 高级学术勋章 初级信用勋章 特级学术勋章 高级热心勋章 中级信用勋章 特级热心勋章 高级信用勋章 特级信用勋章

楼主
reduce_fat 发表于 2024-8-18 11:33:22 |AI写论文
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。

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




最佳答案

关键词:Product excel表格 produc Excel表 EXCEL
复制粘贴积分链接 https://bbs.pinggu.org/ext8_airdrop.php?airdropfrom^^uid=2669999

沙发
逸水清尘1 发表于 2024-8-18 11:33:23
  1. proc import datafile="xxxxxxxxx\TEMP.XLSX"
  2.     out=aa1;
  3. run;

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

  13. ****get product_name for all bad/good***;
  14. data a3;
  15.   set a2;
  16.   by year name subcat product_details;
  17.   if first.subcat then sum=cost;
  18.     else sum+cost;
  19.   if last.subcat;
  20. run;
  21. proc sort data=a3;by year name subcat product_details;run;

  22. proc transpose data=a3 out=a4 prefix=cost;
  23.   by year name;
  24.   id subcat;
  25.   var sum;
  26. run;

  27. data a5;
  28.   set a4;
  29.   if nmiss(cost1,cost2)=0 then differ=cost2-cost1;**bad minus good***;
  30.   subcat=2;
  31.   keep year name differ subcat;
  32. run;
  33. proc sort data=a5;by year name subcat;run;
  34. proc sort data=a3;by year name subcat;run;

  35. data final;
  36.   merge a3(in=a) a5(in=b);
  37.   by year name subcat;
  38.   if a;
  39.   Bad_Good_Diff=differ;
  40.   keep  year name subcat product_details Bad_Good_Diff
  41.        product_name quality_indicator;
  42. run;[img][/img]
复制代码
[img][/img]

藤椅
逸水清尘1 发表于 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。
可以得到如上结果

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

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

地板
reduce_fat 发表于 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 也显示. ?

7
逸水清尘1 发表于 2024-8-23 13:50:37
reduce_fat 发表于 2024-8-21 07:34
谢谢解答, 请跟进:问题好像出在这一行:proc sort data=a2;by year name subcat product_details;run; 你 ...
这里其实算是code的基本转换,可以找个时间详细聊。
1.首先nodupkey会删除数据,你需要确认数据是不是真的有重复的。
2. sum=sum+cost。理解是正确的
3. id 是将计算出的cost横向转置成两个变量,一个good, 一个bad。如果只有一个值,就只在这个对应转置后的上有值,后续也 就不能计算出diff。 跟你上面给出的方法是一致的

8
reduce_fat 发表于 2024-8-23 23:50:35
逸水清尘1 发表于 2024-8-23 13:50
这里其实算是code的基本转换,可以找个时间详细聊。
1.首先nodupkey会删除数据,你需要确认数据是不是真 ...
那个nodup 和nodupkey 我应该用哪个都没问题吧?我知道nodupkey 会移除相同的数据针对by option 的变量,但是nodup 是会移除针对所有变量的相同的数据的行数。相同的重复的数据是不需要的。 我用Excel也做了一遍得出的结果和你上面写的SAS 程序的结果差不多。 几千万的成本总和就差不到一块钱。

谢谢。

9
逸水清尘1 发表于 2024-8-24 17:13:14
reduce_fat 发表于 2024-8-23 23:50
那个nodup 和nodupkey 我应该用哪个都没问题吧?我知道nodupkey 会移除相同的数据针对by option 的变量, ...
nodup和nodupkey两个用法有一点细微区别, nodup是自动遍历你数据集所有变量进行去重, Nodupkey会按照你指定的变量去重,建议还是使用Nodupkey,不过你自己需要清楚哪个变量是对应记录的唯一号。   为啥你那边数据会有重复呢?重复的数据如果是记录的话,可能需要追查下原因了

10
reduce_fat 发表于 2024-8-28 05:09:51
逸水清尘1 发表于 2024-8-24 17:13
nodup和nodupkey两个用法有一点细微区别, nodup是自动遍历你数据集所有变量进行去重, Nodupkey会按照你 ...
用消息价格微信吧,以后有SAS问题可以更及时的请教你。
复制粘贴积分链接 https://bbs.pinggu.org/ext8_airdrop.php?airdropfrom^^uid=2669999

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

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