gpt4 book ai didi

sas - 从当前观察中读取下一个 k 观察

转载 作者:行者123 更新时间:2023-12-02 08:27:54 24 4
gpt4 key购买 nike

Here's a very similar question

我的问题与上面链接中的问题有点不同。

背景

我有一个包含每小时数据的数据集。所以每个对象每天有 24 条记录。现在我想为每个对象创建 K 新列代表接下来的 1,2,...K 小时记录。如果不存在,则用缺失值替换它们。

K 是动态的,由用户定义。

必须保留原始顺序。无论是在数据步骤中保证还是最后使用排序。

我正在寻找一种有效的方法来实现这一点。

示例

原始数据:

Object Hour Value 
A 1 2.3
A 2 2.3
A 3 4.0
A 4 1.3

给定K = 2,期望的输出是

Object Hour Value Value1 Value2
A 1 2.3 2.3 4.0
A 2 2.3 4.0 1.3
A 3 4.0 1.3 .
A 4 1.3 . .

可能的解决方案

  1. 倒序排列->获取前k条记录->倒序排列。

当没有。观察量很大,这不应该是一种理想的方式。

  1. proc 展开。我不熟悉它,因为它从未在我的电脑上获得许可。

  2. 在数据步骤中使用point

  3. retain 数据步骤中的语句。我不确定这是如何工作的。

最佳答案

假设这是作为一个宏变量提供的,这很容易通过边到边合并提前完成。对于比总记录数大得多的 K,肯定比转置更快,并且可能比循环 POINT 更快。

基本上,您将原始数据集合并到自身,并使用 FIRSTOBS 为每个连续的合并迭代将起点向下推一个。如果您有需要保护的 BY 组,这需要一些额外的工作,但这通常不太难管理。

这是一个使用 SASHELP.CLASS 的例子:

%let K=5;

%macro makemergesets(k=, datain=, varin=, keepin=);
%do _i = 2 %to &k;
&datain (firstobs=&_i rename=&varin.=&varin._&_i. keep=&keepin. &varin.)
%end;
%mend makemregesets;

data class_all;
merge sashelp.class
%makemergesets(k=&k,datain=sashelp.class, varin=age,keepin=)
;
run;

关于sas - 从当前观察中读取下一个 k 观察,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30321413/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com