Arrays SAS对齐数据集-使用阵列?
我有一个相当复杂的情况,作为SAS的新手,我正在拼命寻找解决方案。我有两个数据集(控制器、daq),每个数据集中都有一个功率测量。我需要将控制器数据与daq数据对齐。每个数据集中都有一个时间戳,但他们没有费心将daq与控制器进行时间同步,因此两者之间存在不确定的时间增量。更复杂的是,两个系统都以不同的速率对数据进行采样。。。。虽然控制器仅在测试期间记录数据,但daq记录的时间更长。因此,对于典型的测试运行,控制器大约有1000行数据,daq在不同采样率下有30000行数据(这意味着绝对测量值不可能精确匹配) 我试图找出一种自动对齐数据的方法,即找出控制器数据曲线与daq数据曲线最接近的位置,给出时间增量 我目前的想法是迭代两个数组,从controllerow[j]中减去daqrow[i],然后将曲线的增量相加,找到最小增量:Arrays SAS对齐数据集-使用阵列?,arrays,sas,vertical-alignment,Arrays,Sas,Vertical Alignment,我有一个相当复杂的情况,作为SAS的新手,我正在拼命寻找解决方案。我有两个数据集(控制器、daq),每个数据集中都有一个功率测量。我需要将控制器数据与daq数据对齐。每个数据集中都有一个时间戳,但他们没有费心将daq与控制器进行时间同步,因此两者之间存在不确定的时间增量。更复杂的是,两个系统都以不同的速率对数据进行采样。。。。虽然控制器仅在测试期间记录数据,但daq记录的时间更长。因此,对于典型的测试运行,控制器大约有1000行数据,daq在不同采样率下有30000行数据(这意味着绝对测量值不可
set work.daqPower work.controlPower
array pwr_daq{*} daqPwr; /* daqPwr is name of power variable in work.daqPower */
array pwr_control{*} controlPwr; /* controllPwr is name of power variable in work.controlPower */
do idaq=1 to (30000 - 1000);
x = idaq;
tmp = 0;
do jcontrol=1 to 1000;
tmp = tmp + ABS(pwr_daq[x] - pwr_control[jcontrol]);
x = x + 1;
end;
output;
end;
我显然不理解数组文档。我一直在网上搜索并浏览了很多示例,但我并没有找到任何显示读取两个数据集并从中创建独立数组的示例。如果您有任何类似示例的链接,或者您对更好的方法有任何想法,我将不胜感激
谢谢
弗雷德
更新数据样本:
DateTime daqPower
05JUL12:10:10:00 205.45687866211
05JUL12:10:10:00 204.33529663086
05JUL12:10:10:00 204.17504882813
05JUL12:10:10:00 203.53414916992
05JUL12:10:10:00 203.53414916992
05JUL12:10:10:00 204.81597900391
05JUL12:10:10:00 204.33529663086
05JUL12:10:10:00 205.13641357422
05JUL12:10:10:00 207.05914306641
05JUL12:10:10:00 206.73867797852
05JUL12:10:10:00 207.05914306641
05JUL12:10:10:00 208.50119018555
05JUL12:10:10:00 208.50119018555
05JUL12:10:10:00 207.53982543945
05JUL12:10:10:00 207.21936035156
05JUL12:10:10:00 206.73867797852
05JUL12:10:10:00 206.09777832031
05JUL12:10:10:00 205.77731323242
05JUL12:10:10:00 205.13641357422
05JUL12:10:10:00 205.45687866211
DateTime controlPower
05JUL12:10:01:19 226.8705902
05JUL12:10:01:19 232.526886
05JUL12:10:01:19 236.9337006
05JUL12:10:01:19 242.3483887
05JUL12:10:01:19 246.9274292
05JUL12:10:01:19 246.3426819
05JUL12:10:01:19 244.3251495
05JUL12:10:01:19 242.6235352
05JUL12:10:01:20 243.5477753
05JUL12:10:01:20 240.9849854
05JUL12:10:01:20 230.8181458
05JUL12:10:01:20 225.579071
05JUL12:10:01:20 221.7199097
05JUL12:10:01:20 214.7053986
05JUL12:10:01:20 212.1452332
05JUL12:10:01:20 210.9714203
05JUL12:10:01:20 213.6631317
05JUL12:10:01:20 213.3510437
05JUL12:10:01:21 209.8970642
05JUL12:10:01:21 210.884964
请记住,时间不匹配(我们“听说”时间戳可能彼此不同步约10分钟)。关键是,来自控制器的曲线的间隔比daq短得多,我们正试图通过对齐控制器曲线最接近控制器曲线的位置来确定时间差。我之所以说曲线,是因为最初只想匹配最大值,但虽然控制器数据中只有一个最大值,但daq数据会持续更长的时间,功率曲线会多次穿过该值,因此很难根据该值对齐数据。弗雷德,这里有一些想法可以尝试。我同意IML可能是你的出路,但你必须利用你手头的东西 首先,使用数组,您可以使用PROC TRANSPOSE或带有RETAIN语句的数据步骤修改控制器数据集,以生成两个数组(一个用于时间,另一个用于测量),并在填充所有数组元素后仅输出最终观测值。然后,您可以对两个SET语句使用单独的数据步骤(第一个设置DAQ数据集,然后是“IF N EQ 1 then SET;”。您需要在此新数据集中设置数组,并再次使用RETAIN语句在整个处理过程中保留这些数组。然后,您可以使用DO循环来处理数组中的信息,其中DAQ观测中的时间变量等于或介于存储在时间数组中的功率观测日期之间。这是一个ra除非您使用KEEP或DROP语句来限制最终输出,否则处理信息的方法会比较混乱,并且会导致一个相当大的矩阵。但是,此方法允许您通过多个观测值之间的外推值来修改控制器观测值 相比之下,我不认为我的第二个和第三个建议可以让你在两个值之间进行推断,但我还是会建议它们 第二个选项,使用PROC FORMAT从控制器数据集创建用户定义的格式,值为时间,格式化值为功率观测值。您需要按时间对数据进行排序,然后可以使用lag函数定义开始值和结束值以传递到格式中。在格式为cre后然后,您可以使用该格式在DAQ数据集中根据DAQ时间变量的格式化值的位置创建新变量。如上所述,使用此过程在值之间进行外推是不可行的 第三个选项是第二个选项的变体,但是您可以使用DATA Step组件对象来创建哈希对象,您可以通过该哈希对象进行迭代来检索所需的值,而不是使用格式。我不经常使用此方法,因此不必费心描述它,但您可以在SAS网站上找到它的文档 第四个选项可能比其中任何一个都要好,但您必须使用SAS/ETS模块。您可以使用扩展过程将控制数据集中的功率观测值外推到与DAQ数据集时间变量一致的时间频率,然后合并此扩展数据集使用DAQ数据集。这种方法可以让您对如何进行外推进行相当多的控制,并且非常容易实现,但同样,您必须使用ETS模块才能使用该过程
我没有提供任何例子,因为我的回答过于冗长(可能是评论,但太长了),但如果您想让我尝试为所讨论的方法之一提供一些示例代码,请告诉我。祝您好运。由于您有ETS,请参阅以下PROC TIMESERIES示例,特别是最后的互相关图: 互相关图将在最佳滞后处达到峰值
您还可以使用PROC TIMESERIES来规范化采样率。您可能不想使用数组。请使用两个数据集中的一些样本数据更新您的问题,这足以说明问题。然后,显示一个您想要的输出数据示例。同意Bob的说法。SAS实际上并不是以这种方式使用数组-这更像是R/c矩阵概念,除非你是