【水煮 SAS】漫话 Program Data Vector (PDV)

DATA step 是SAS 发家的看家本领,逐行处理,能够处理很大的数据。这一点在几十年前,计算机内存, CPU 都落后的年代,是多么地重要。

具体地说,就是 SAS 每次从 Input data 读入一条记录,在内存里进行各种运算,然后输出到 Output data。Input – Process – Output,  这个迭代循环过程,周而复始,直到处理完所有数据。请记住: 使用 DATA step 的时候,内存里永远只有一条记录。

Program Data Vector (PDV),  是学习 DATA step 的基础。初学 SAS 的人,总觉得其抽象难以理解,头痛得很。后来,我在教授他人的时候,为了深入浅出,是这样解释的:

各位同学,如果你在农村待过,看过做砖、脱坯、打煤球的话,就应该明白, PDV 就是做砖脱坯的模具。

你如果要做砖脱坯的话,预先要准备好模子,每次做三个或者五个。模子准备好了,就要去把一大堆和好的泥巴 (raw data) 往模子里填,等填满后,把模具搬到场院中间进行脱模。这样的过程周而复始,每次只做出3块,排列成行,这样的iteration 迭代循环,重复进行,直到把数据读完为止。

为了下一次往模子里填泥巴,模具必须预先清空才行,如果已经满了,怎么再装?这就是所谓的 reintializing:

Generally, SAS data step set variables to missing each time a new observation is read. Please note: the variables from a current SAS data set will NOT be reinitialized. Instead, their values are retained from previous iteration automatically, SAS only overwrite the values.

当然,SAS 每次不只做三块砖,根据你的指令,它可以在执行之前预先为你准备好你需要的模子,这就是编译阶段 (compile phase)。模子一旦准备好,就是一再重复的迭代执行阶段了 (execution phase),。

瞧瞧, SAS DATA step 处理数据,就和做砖脱坯一样,Input-Process-Output, 重复循环,直到处理完每条记录。

Is it clear?

有的同学说,周老师,我还是不理解,因为没去过农村, 没见识过做砖脱坯打煤球,咋办?

我只能深深地叹口气说:

生活条件太好了也不一定是好事。出来混,早晚是要还的 ~~~ 🙂

Responses

error: Content is protected !!