g*********o 发帖数: 20357 | 1 有点象医院数据的adjudication问题,假设有这样的数据
ID AMOUNT
1 -1
1 -2
1 1
1 1
1 2
1 3
: :
: :
2 -1
: :
: :
想输出着样的数据
ID AMOUNT ADJ_AMOUNT
1 -1 0
1 -2 0
1 1 0
1 1 1
1 2 0
1 3 3
: : :
: : :
2 -1 :
: : :
: : :
意图就是针对每一组ID,把AMOUNT的值相反的一对找出来,对消掉为0,得出ADJ_
AMOUNT
多谢! |
f****r 发帖数: 1140 | |
y****2 发帖数: 34 | 3 什么叫 “把AMOUNT的值相反的一对找出来,对消掉为0”? |
g*********o 发帖数: 20357 | 4 一组多少个obs不一定,当然可以用proc freq得到,但是不恒定
【在 f****r 的大作中提到】 : 这应该跟你ID一组多少个有点关系吧?
|
g*********o 发帖数: 20357 | 5 就是找到id相同,而且amount的绝对值相同,但是符号相反的两个obs,把它们的adj_
amount赋为0,如果找不到相对应
的obs就adj_amount = amount
【在 y****2 的大作中提到】 : 什么叫 “把AMOUNT的值相反的一对找出来,对消掉为0”?
|
y****2 发帖数: 34 | 6 ID AMOUNT ADJ_AMOUNT
1 -1 0
1 -2 0
1 1 0
1 1 1
1 2 0
1 3 3
: : :
: : :
2 -1 :
: : :
: : :
为什么第五个observation的adj_amount是1呢? 不应该是0吗? 它有配对的第一个obs
啊。 是不是第一个obs跟第三个已经处理过了? |
f****r 发帖数: 1140 | 7 如果符号相反的数值有好多个,有的没有被抵消,那是剩最后一个不被调整为0?
【在 g*********o 的大作中提到】 : 就是找到id相同,而且amount的绝对值相同,但是符号相反的两个obs,把它们的adj_ : amount赋为0,如果找不到相对应 : 的obs就adj_amount = amount
|
g*********o 发帖数: 20357 | 8 啊,这位同学真严谨,那就再加一个时间变量,先把数据按ID & DATE排序,然后从前
往后对消,找到一对就消掉,剩下最后面的消不掉的,谢谢!
输入数据
ID DATE AMOUNT
1 1 -1
1 2 -2
1 3 1
1 4 1
1 5 2
1 6 3
: : :
: : :
2 1 -1
: : :
: : :
输出数据
ID DATE AMOUNT ADJ_AMOUNT
1 1 -1 0
1 2 -2 0
1 3 1 0
1 4 1 1
1 5 2 0
1
【在 f****r 的大作中提到】 : 如果符号相反的数值有好多个,有的没有被抵消,那是剩最后一个不被调整为0?
|
p********a 发帖数: 5352 | 9 这个有点象我做的PHARMACY CLAIMS的ADJUSTMENT。我是这么做的
1. Subset data. Amount postive 的 go to RX_plus. Amount Negative的 go to RX_
minus.
2. Sort Rx_plus, Rx_minus by ID, date and amount
3. 如果ID, DATE, AMOUNT相同的,assign sequence number (1,2,3...)
4. Merge (Left join) by ID, Date, abs(amount), sequence number, 然后清零。 |
p********a 发帖数: 5352 | 10 有个我以前写的类似的CODE,供参考。
data pbm_plus pbm_minus;
set pbm;
if paid<0 then output pbm_minus;
else output pbm_plus;
run;
proc sort data=pbm_plus; by mem_no &filldate ndc paid;run;
data pbm_plus;
set pbm_plus;
retain thread 0;
by mem_no &filldate ndc paid;
if first.paid then thread=1;
if not (first.paid) then thread=thread+1;
obs_plus=_N_;
run;
proc sort data=pbm_minus; by mem_no &filldate ndc paid;run;
data pbm_minus;
set pbm_minus;
retain thread 0;
by mem_no &filldate ndc paid;
if first.paid then thre |
p********a 发帖数: 5352 | 11 SAS其实有个专门的AUDIT PROCESS来做这个的,用它很简单。不过我实在是懒得研究了
。如果你经常用的话,最好用那个Audit Trail |
g*********o 发帖数: 20357 | 12 Thanks, but I don't quite understand.
1. Create two sub-dataset: RX_plus and RX_minus.
2. Sort these two sub-datasets by ID, date and amount.
3. I don't understand this "如果ID, DATE, AMOUNT相同的,assign sequence
number (1,2,3...)". Are you doing this by "merge"? What if the number of
positive obs and negative obs are different?
RX_
【在 p********a 的大作中提到】 : 这个有点象我做的PHARMACY CLAIMS的ADJUSTMENT。我是这么做的 : 1. Subset data. Amount postive 的 go to RX_plus. Amount Negative的 go to RX_ : minus. : 2. Sort Rx_plus, Rx_minus by ID, date and amount : 3. 如果ID, DATE, AMOUNT相同的,assign sequence number (1,2,3...) : 4. Merge (Left join) by ID, Date, abs(amount), sequence number, 然后清零。
|
g*********o 发帖数: 20357 | 13 Sorry, you are too fast. Please ignore my last reply.
Thanks. |