2015-02-23 2 views
0

Я пытаюсь вычислить ряд значений, каждый из которых основан на одном после него. Например, переменная A в строке 10 используется для вычисления переменной B в строке 9, переменной A в строке 10 и переменной B в строке 9 используется для вычисления переменной C в строке 8 и т. Д. Есть ли хороший способ сделать это? Каждая строка имеет символьную переменную/имя, которая ее маркирует. Я попытался заявление сохранить с этим кодом, но не сохраняя, что определенное значение:SAS Retain Специфическая переменная для последующего использования

data null; 
set oldData; 
if name = 'Jimmy' then do; 
    variableA = variableNull1 + variableNull2; 
    retain variableA; 
end; 
if name = 'Johnny' then do; 
    variableB = variable A + variableNull3; 
    retain variableB; 
end; 
if name = 'Bobby' then do; 
    variableC = variableA + variable B + variableNull4; 
    retain variableC; 
end; 
(continue process for a few more lines) 
run; 

Другая идея заключается в том, если я мог бы легко заполнить вверх и вниз для каждой переменной, которая будет работать также. Спасибо всем за помощь.

Нужный выход:

Jimmy  VariableNull3         VariableC 
Johnny VariableNull2     VariableB 
Bobby  VariableNull1  VariableA 

Обратите внимание, что нулевые переменные являются общими и не может быть несколько. Это также хорошо, если бы мы имели такой выход (но первый из них предпочтительнее):

Jimmy  VariableNull3  VariableA  VariableB   VariableC 
Johnny VariableNull2  VariableA  VariableB   VariableC 
Bobby  VariableNull1  VariableA  VariableB   VariableC 
+1

Можете ли вы разместить входной набор данных и желаемый выходной образец? – NEOmen

+0

@NeOmen Я только что добавил два выхода, которые были бы в порядке со мной. Благодаря! – Code4Days

+0

Не могли бы вы также разместить образец ввода? – NEOmen

ответ

-1

Просьба предоставить образцы данных, чтобы уточнить, что именно вы после этого.

/* fake data */ 
data sample; 
do i = 1 to 10; 
VariableNULL1 = rand("Uniform"); 
VariableNULL2 = VariableNULL1 * 1.02; 
VariableNULL3 = 0.55 * VariableNULL2 + 0.35; 
VariableNULL4 = VariableNULL3 + 0.2; 
output; 
end; 
drop i; 
run; 

/* Everytime you get VarA first, then based on that you have VarB and so on. Retain statement will keep the previous record */ 
data sample2; 
set sample; 
/* retain previous values */ 
retain prev1-prev2; 
VariableA = sum(of VariableNULL1-VariableNULL2); /* VarA is based on VarNULLs */ 
VariableB = prev1 + VariableNULL3; /* VarB is derived from previous VarA */ 
VariableC = prev2 + VariableNULL3 + VariableNULL4; 
prev2 = prev1; 
prev1 = VariableA; 
drop prev:; /* it will be more clear to you if you keep prev1 & prev2 in output dataset. It shows how SAS calculate VarB and VarC */ 
run; 
+0

Пожалуйста, напишите больше, чем просто код в ответе - на самом деле, не-кодовые пояснения являются более важными, чем код. Объясните, как ваше решение решает проблему, поэтому мы учим программистов ловить рыбу, а не просто давать им рыбу. – Joe

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