在 SAS 中,设置 2 个数据集时 RETAIN 有什么用,而在 Python 中等效的数据集有什么用?

In SAS, what is the use of RETAIN when setting 2 datasets, and the equivalent in Python?

提问人:stranger12309 提问时间:11/16/2023 最后编辑:stranger12309 更新时间:11/20/2023 访问量:51

问:

我正在尝试将一些 SAS 代码重新编码为 Python。我有以下SAS代码:

DATA DF_FINAL;
    RETAIN UEN UEN_NO FEE;  
    SET DF_ADJ1 DF_ADJ2;
    KEEP UEN UEN_NO FEE;
RUN;

我不明白 RETAIN 需要什么,我需要 Python 中的等效项。我尝试在没有 RETAIN 行的情况下运行代码,但得到相同的输出。请协助。

谢谢

Python SAS 保留

评论

1赞 whymath 11/16/2023
该语句用于对数据集中的变量进行重新排序,新顺序为:UEN、UEN_NO、FEE 和其他变量。retain
0赞 Tom 11/16/2023
要了解如何转换为 Python,可能需要知道哪些输入数据集保留了三个变量。

答:

1赞 Crimson Space 11/16/2023 #1

在 SAS 中,RETAIN 语句用于在数据步骤的迭代中初始化和保留变量的值。但是,在您提供的代码片段中,RETAIN 语句似乎没有必要。它初始化变量 UEN、UEN_NO 和 FEE,但似乎没有特定用途,特别是因为这些变量是在数据步骤后面使用 SET 语句设置的。

在 SAS 中,SET 语句从数据集中读取观测值,并将该观测值中的变量值复制到程序数据向量 (PDV) 中。在本例中,SET 语句从数据集 DF_ADJ1 和 DF_ADJ2 中读取观测值,但 RETAIN 语句不会影响此过程。当您想要跨迭代结转值时,通常使用 RETAIN 语句。如果您使用的是 Pandas,请尝试使用 pd.concat 沿行连接两个 DataFrame

3赞 Tom 11/16/2023 #2

RETAIN 语句的真正目的是指示在数据步骤开始处理下一个观测值时,在数据步骤中计算的 NEW 变量的值不应将其值重置为 missing。

在此步骤中,RETAIN的正式目的无效。这是因为数据步骤没有计算任何新变量。变量值的唯一来源是输入数据集。来自输入数据集的变量已经“保留”了。

因此,RETAIN 语句在该数据步骤中的唯一用途是确保 UEN 和 UEN_NO 是数据集中的前两个变量。因此,当您打印或查看数据时,这两个将出现在第 1 列和第 2 列中。

它之所以有效,是因为 SAS 按照它第一次看到变量的顺序在数据步骤中创建变量列表。

人们使用 RETAIN 而不是其他一些语句来获得设置变量顺序的副作用的原因是,与其他语句(如赋值语句)中对变量名称的引用不同,SAS 在 RETAIN 语句中看到变量时不会强制使用变量 TYPE。因此,类型和存储长度将由源数据集中如何定义这些变量来决定。

评论

0赞 AlanC 11/16/2023
有趣的汤姆。我以前从未见过像这样使用的保留,但这是有道理的。我总是会服从一个归属,所以我控制了顺序。但是,如果记录中缺少值,则保留项似乎将保留以前的值。如果我错了,请纠正我。
1赞 Tom 11/16/2023
来自输入数据集的变量已被保留。您只是没有注意到,因为在读取下一个观测值时,保留值被覆盖。这就是一对多合并的工作原理。保留从“一个”数据集读取的值,而从“多个”数据集读取多个值。
0赞 Mr. SATAN 11/20/2023 #3

好吧,我所知道的是,retain 语句中提到的那些变量将与它们在父数据集中保持相同,这意味着它们在迭代发生时不会像其他变量(和值)那样被处理,或者我们可以简单地说它们将跳过缓冲区并将直接放置在输出数据集中(也包括格式)。它为我们节省了时间和机器资源。

评论

0赞 Community 11/21/2023
您的答案可以通过其他支持信息进行改进。请编辑以添加更多详细信息,例如引文或文档,以便其他人可以确认您的答案是正确的。您可以在帮助中心找到有关如何写出好答案的更多信息。