2014-10-26 4 views
1

Я пытаюсь вычислить новое поле на основе существующих полей с использованием SAS. Я пробовал функцию задержки, но не работал. Ниже приведены данные и программа, которые я пробовал.Вычислить новую переменную на основе существующих переменных с помощью SAS

необработанных данных:
cust_id Prdct_No no_of_mnths Actual_Shp_Dt граф
х 12 2 8/1/2014 10
х 12 1 8/11/2014 10
х 12 0 8/23/2014 10
у 13 2 8/1/2014 10
у 13 1 8/11/2014 10
у 14а 2 8/1/2014 10
у 14а 1 8/11/2014 10
у 14а-8/21/2014 10
z 15 3 9/1/2014 20
z 15 2 15/15/2012 20

Требуемые результаты:
Target_Ship_Dt является суммой (лаг (Actual_Shp_Dt) и задержка (Count)) сгруппированы по Cust_ID и Prdct_No. Если Actual_Shp_Dt задерживается или раньше target_shp_Dt, тогда Target_Shp_Dt является SUM (отставание (Target_Shp_Dt) и отставание (Count)).

cust_id Prdct_No no_of_mnths Actual_Shp_Dt граф Target_Ship_Dt
х 12 2 8/1/2014 10
х 12 1 8/11/2014 10 8/11/2014
х 12 0 8/23/2014 10 8/21/2014
у 13 2 8/1/2014 10
у 13 1 8/11/2014 10 8/11/2014
у 14а 2 8/1/2014 10
у 14а 1 8/11/2014 10 8/11/2014
y 14a 0 8/21/2014 10 21.08.2012
z 15 3 9/1/2014 20
z 15 2 15/15/2012 20 9/21/2014

Code Я пробовал:
Data Raw_Data (падение = Prdct_ID_lag Actual_Shp_Dt_lag Count_Lag Target_Shp_Dt1);
Set Raw_Data;
By Cust_ID Prdct_ID;
Prdct_ID_lag = lag (Prdct_ID);
Формат Actual_Shp_Dt_lag date9;
Actual_Shp_Dt_lag = lag (Actual_Shp_Dt);
Count_Lag = lag (Count);
Формат Target_Shp_dt date9;
Если Prdct_ID ~ = Prdct_ID_lag, тогда Actual_Shp_Dt_lag =.;
Если Prdct_ID ~ = Prdct_ID_lag, тогда Count_Lag =.;
Target_Shp_Dt1 = Actual_Shp_Dt_lag + Count_Lag;
Target_Shp_Dt = Target_Shp_Dt1;
Если Actual_Shp_Dt> Target_Shp_Dt1, тогда Target_Shp_Dt = Target_Shp_Dt1 + Count_lag;
Если Actual_Shp_Dt < Target_Shp_Dt1 Тогда Target_Shp_Dt = Target_Shp_Dt1 + Count_lag;
Run;

Но этот код не дал мне правильных результатов.

Любая помощь будет оценена по достоинству.

Попробовав новый код: данные:

Cust_ID Prdct_No no_of_mnths Actual_Shp_Dt Граф Target_Ship_Dt
х 12 2 8/1/2014 10
х 12 1 8/11/2014 10 8/11/2014
х 12 0 8/23/2014 10
у 13 2 8/1/2014 10
у 13 1 8/11/2014 10 8/11/2014
у 14а 2 8/1/2014 10
y 14a 1 8/11/2014 10 8/11/2014
y 14a 0 8/21/2014 10 8/21/2014
г 15 3 9/1/2014 20
г 15 2 9/15/2014 20

Код, который работал:
данных Raw_Data (падение = Prdct_ID_lag Actual_Shp_Dt_lag Count_Lag Target_Shp_Dt1);
Set Raw_Data;
By Cust_ID Prdct_ID;
Cust_ID_lag = lag (Cust_ID);
Prdct_ID_lag = lag (Prdct_ID);
Формат Actual_Shp_Dt_lag Target_Shp_Dt date9;
Actual_Shp_Dt_lag = lag (Actual_Shp_Dt);
Count_Lag = lag (Count);
keep target_shp_dt_lag;
Если Cust_ID = Cust_ID_lag и Prdct_ID = Prdct_ID_lag и target_shp_dt_lag =.
Затем Target_Shp_Dt = Actual_Shp_Dt_lag + Count_Lag;
ELSE IF Cust_ID = Cust_ID_lag и Prdct_ID = Prdct_ID_lag
Тогда Target_Shp_Dt = target_shp_dt_lag + Count_Lag;
ELSE Target_Shp_Dt =.;
target_shp_dt_lag = Target_Shp_Dt;
Run;

+0

Возможно, вы могли бы дважды проверить ожидаемый target_shp_dt для последней строки в данных вашего примера? – user667489

ответ

0

В вашем определении указано, что вам нужно использовать lag (target_shp_dt), если исходный target_ship_dt не равен actual_shp_dt, но ваш код на самом деле этого не делает.

Update:

Кажется, что lag не работает для переменных, созданных в том же шаге данных, но с использованием retain делает, поэтому Target_Shp_Dt_lag intially были все недостающие значения.

Кроме того, вы уверены в самой последней строке в вашем наборе данных примера? Кажется, что это не соответствует вашим правилам: lag (count) + lag (actual_shp_dt) = 9/21/2014, но 9/21/2014> 15/15/2014, так что это означало бы, что вам нужно будет задерживаться (count) + lag (target_shp_dt), что приводит к отсутствию значения в виде задержки (target_shp_date). Код ниже работает для всех остальных случаев.

data raw_data; 
input Cust_ID :$1. Prdct_No :$3. no_of_mnths :3. Actual_Shp_Dt :mmddyy10. Count :3.; 
format actual_shp_dt yymmdd10.; 
cards; 
x 12 2 8/1/2014 10 
x 12 1 8/11/2014 10 
x 12 0 8/23/2014 10 
y 13 2 8/1/2014 10 
y 13 1 8/11/2014 10 
y 14a 2 8/1/2014 10 
y 14a 1 8/11/2014 10 
y 14a 0 8/21/2014 10 
z 15 3 9/1/2014 20 
z 15 2 9/15/2014 20 
; 
run; 

data want; 
input Cust_ID :$1. Prdct_No :$3. no_of_mnths :3. Actual_Shp_Dt :mmddyy10. Count :3. Target_ship_dt :mmddyy10.; 
format actual_shp_dt Target_ship_dt yymmdd10.; 
infile cards missover; 
cards; 
x 12 2 8/1/2014 10 
x 12 1 8/11/2014 10 8/11/2014 
x 12 0 8/23/2014 10 8/21/2014 
y 13 2 8/1/2014 10 
y 13 1 8/11/2014 10 8/11/2014 
y 14a 2 8/1/2014 10 
y 14a 1 8/11/2014 10 8/11/2014 
y 14a 0 8/21/2014 10 8/21/2014 
z 15 3 9/1/2014 20 
z 15 2 9/15/2014 20 9/21/2014 
; 
run; 

Data have(drop = Prdct_no_lag Actual_Shp_Dt_lag Count_Lag Target_Shp_Dt1 Target_Shp_Dt_lag) ; 
Set raw_data; 
By Cust_ID Prdct_no; 
Prdct_no_lag = lag(Prdct_no); 
Actual_Shp_Dt_lag = lag(Actual_Shp_Dt); 
Count_Lag = lag(Count); 
retain target_shp_dt_lag; 
if first.prdct_no then call missing(Actual_Shp_Dt_lag, count_lag, prdct_no_lag, target_shp_dt_lag); 
Target_Shp_Dt1 = Actual_Shp_Dt_lag + Count_Lag; 
Target_Shp_Dt = Target_Shp_Dt1; 
If Actual_Shp_Dt ne Target_Shp_Dt1 Then Target_Shp_Dt = Target_Shp_Dt_lag + Count_lag; 
Target_Shp_Dt_lag = Target_Shp_Dt; 
format Actual_Shp_Dt_lag Target_Shp_dt: yymmdd10.; 
Run; 

proc compare base = want compare = have; 
    var Target_Shp_Dt; 
run; 
+0

Привет .. Большое спасибо за ответ. Я пробовал код, но не работал для меня. Target_Shp_Dt_lag полностью пуст, и было заполнено всего несколько строк Target_Shp_Dt, но сумма Actual_shp_dt и Count_lag ... – user3431230

+0

Это определенно работает для меня, но, возможно, вам нужно изменить некоторые имена переменных для совместимости с вашим существующим кодом? – user667489

+0

Привет, я использую SAS EG 5.1 ..Когда я работал над программой, так как она была с одним и тем же набором данных, я получил вывод, который я вставил в свой исходный вопрос. – user3431230

Смежные вопросы