2015-02-23 126 views
0

我试图计算一系列基于后面的值的值。例如,第10行中的变量A用于计算第9行中的变量B,第10行中的变量A以及第9行中的变量B用于计算第8行中的变量C等。是否有一种很好的方法可以做到这一点?每行都有一个字符变量/名称来标记它。我已经尝试使用此代码保留声明,但不保留特定值:SAS保留特定变量供以后使用

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 2015-02-23 02:57:37

+0

@NeOmen我刚刚添加了两个输出,可以和我在一起。谢谢! – Code4Days 2015-02-23 03:09:37

+0

你可以发布样本输入吗? – NEOmen 2015-02-23 03:11:49

回答

-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 2015-02-23 15:40:27