2015-09-25 54 views
-2

有谁知道如何使用SAS中的滞后,只考虑变量的最后已知数字,而不是缺少值,即不是“。”。按照以下顺序:9,10,8,...,7?SAS滞后排除缺失值?

data have; 
    input val; 
    datalines; 
9 
10 
8 
. 
7 
; 
run; 

我想的表包含下列:

val want_val 
9 9 
10 10 
8 8 
. 8 
7 7 
+0

这不是SAS编程问题,而是一个关于如何使用SAS过程来转换数据的问题。我建议你在community.sas.com上发布非编程问题。作为一个开始的好地方,请看PROC EXPAND和可能的转换选项。这将允许你实现你的目标。 –

+0

这读起来像一个编程问题的开始。建议您提供样本数据,并描述您想要的输出数据。同时显示您尝试过的任何代码,以及为什么它不起作用。听起来好像你正在试图做“最后的观察结果”而不是简单的滞后。 Google搜索SAS LOCF可以帮助创意。 – Quentin

+0

我不明白这不是一个编程问题......它不是很详细,但它可能比这里的一半问题要好。 – Joe

回答

0

使用条件逻辑,而不是直接滞后功能。

  1. 使用滞后函数
  2. 创建另一个变量发生滞后功能仅当值不缺少创建一个滞后变量。

    data have; 
    input y; 
    cards; 
    9 
    10 
    8 
    . 
    7 
    ; 
    
    
    data want; 
    set have; 
    retain x_lag; 
    x=lag(y); 
    if x ne . then x_lag=x; 
    run; 
    
    proc print data=want; 
    var y x_lag; 
    run; 
    

OUTPUT:

        Obs  y x_lag 

            1  9  . 
            2  10  9 
            3  8  10 
            4  .  8 
            5  7  8 
+0

看起来好像完全相同的结果可以在不使用'lag'的情况下获得,否?输出后保留并设置它? – Joe

+0

取决于该步骤中还做了些什么。如果只有滞后那么工作,但如果你正在做其他处理可能会有一些问题。 – Reeza

+0

我不明白你的意见“取决于”,我运行了代码,它似乎不工作。我同意Joe LAG对LOCF不好。 –

0

这可能是一种情况,使用IF语句LAG是一个好主意。一旦你理解了这两个陈述如何协同工作,你可以利用它们来获得优势(或避免常见的陷阱)。我建议阅读this了解更多详情。

与此同时,这段代码是做你想做的吗?

data lags; 
input num; 
if not missing(num) then lag_num = lag(num); 
datalines; 
9 
10 
8 
. 
7 
; 
run; 
+0

这不是*很*正确,很可能(尽管问题不是很清楚)。大多数用例需要在每行都填充lag_num,并使用最新的nonmissing。 – Joe