SAS转置和重塑数据集

SAS转置和重塑数据集,sas,Sas,我拥有以下结构的原始数据集: | Ticker | Time | Stock Return | |----------|----------|--------------| | Facebook | 12:00:01 | 1% | | Facebook | 12:00:02 | 1.5% | | ... | | | | Apple | 12:00:01 | -0.5% | |

我拥有以下结构的原始数据集:

| Ticker   | Time     | Stock Return |
|----------|----------|--------------|
| Facebook | 12:00:01 | 1%           |
| Facebook | 12:00:02 | 1.5%         |
| ...      |          |              |
| Apple    | 12:00:01 | -0.5%        |
| Apple    | 12:00:02 | -0.3%        |
| ...      |          |              |
| Alibaba  | 12:00:01 | -0.5%        |
| Alibaba  | 12:00:02 | -0.3%        |
| ...      |          |              |
| Facebook | Apple |   ...... | Alibaba |
|----------|-------|----------|---------|
| 1%       | 1.3%  |          | 1.8%    |
| 1.5%     | 1.2%  |          | 1.5%    |
| ...      | ...   |          | ...     |
| 0.1%     | 1.7%  |          | 1.3%    |
| 0.3%     | 2.3%  |          | 0.2%    |
现在,我想构建一个具有以下结构的新数据集:

| Ticker   | Time     | Stock Return |
|----------|----------|--------------|
| Facebook | 12:00:01 | 1%           |
| Facebook | 12:00:02 | 1.5%         |
| ...      |          |              |
| Apple    | 12:00:01 | -0.5%        |
| Apple    | 12:00:02 | -0.3%        |
| ...      |          |              |
| Alibaba  | 12:00:01 | -0.5%        |
| Alibaba  | 12:00:02 | -0.3%        |
| ...      |          |              |
| Facebook | Apple |   ...... | Alibaba |
|----------|-------|----------|---------|
| 1%       | 1.3%  |          | 1.8%    |
| 1.5%     | 1.2%  |          | 1.5%    |
| ...      | ...   |          | ...     |
| 0.1%     | 1.7%  |          | 1.3%    |
| 0.3%     | 2.3%  |          | 0.2%    |
也就是说,除了股票回报率,我放弃了所有的变量。新数据集中的stock return变量将重命名为stock ticker名称

时间应该是连续的(一秒接一秒),并且它们应该在每一行中匹配

在原始数据集中,不同行中可能有重复的股票代码

我想知道如何才能做到这一点?我这样做是为了进行主成分分析

我正在考虑以下方法:

DATA PCASET; 
    SET ORIGINAL DATASET; 

RUN; 

但是,我不知道如何命名列…

如果保留时间变量,则需要按时间和股票代码排序,然后进行转置

 proc sort data=have;
   by time ticker ;
 run;
 proc transpose data=have out=want ;
   by time ;
   id ticker ;
   var stock_return ;
 run;
然后,每个时间值将获得一个观察值


否则,您需要将每个TICKER的数据减少到一条记录,然后使用相同的转置,而不使用BY语句,以便获得单个输出观察。

如果保留时间变量,则需要按时间和TICKER排序,然后转置

 proc sort data=have;
   by time ticker ;
 run;
 proc transpose data=have out=want ;
   by time ;
   id ticker ;
   var stock_return ;
 run;
然后,每个时间值将获得一个观察值



否则,您需要将每个股票代码的数据减少到一条记录,然后在不使用BY语句的情况下使用相同的转置,以便获得一个输出观察。

。您打算如何处理这些多个记录?我计划对其运行proc factor。这是这样的:我看不出这与你的问题有什么关系。我需要为主成分分析准备数据。仍然与你的问题无关——一次一个问题。您当前的问题是如何重新格式化数据。还是别的什么?我假设您已经与proc factor/pca检查过这是您需要的格式类型,因为我不会为您这样做。在编译数据以使其有意义之后,proc TRANSPOSE。您打算如何处理这些多个记录?我计划对其运行proc factor。这是这样的:我看不出这与你的问题有什么关系。我需要为主成分分析准备数据。仍然与你的问题无关——一次一个问题。您当前的问题是如何重新格式化数据。还是别的什么?我假设你已经和proc factor/pca核实过这是你需要的格式类型,因为我不会为你这样做。转置后我得到了非常奇怪的结果。有些列缺少数据,有些列(最后一列)没有标记。为什么?@JinhuaWang你的日志没有错误吗?通常这意味着您没有正确处理输入数据集。正如Tom所说的,您需要将数据减少到每秒一条记录。如果任何数据在转置前丢失,转置后将丢失。在转置步骤之前,日志是无错误的。我在想,这是不是因为不是每个股票都包含在每个时段?有些股票并不总是交易。。。但是这应该会导致空列名和非空列内容。@JinhuaWang“这应该导致空列名”的说法没有意义。想想转置应该如何工作——您正在翻转数据,并期望每个时间/股票代码都有一个记录。如果没有股票代码,那么就没有列标题,但是如果你有一条股票代码的记录,你就会得到一列。我想你需要阅读手册和一些文档。或者玩一玩,看看你用一个小测试数据集得到了什么,这样你就能理解它了。我个人推荐后者。@Reeza我试过加州大学洛杉矶分校的例子,它们似乎奏效了。我还对它进行了处理,删除了一些ID,我确实发现列名仍然存在,但只有一些空列内容。现在我更不确定我的股票数据集上发生了什么。。。似乎没有理由使用空列名称,但我有最后100多个没有名称的列……在转置之后,我得到了非常奇怪的结果。有些列缺少数据,有些列(最后一列)没有标记。为什么?@JinhuaWang你的日志没有错误吗?通常这意味着您没有正确处理输入数据集。正如Tom所说的,您需要将数据减少到每秒一条记录。如果任何数据在转置前丢失,转置后将丢失。在转置步骤之前,日志是无错误的。我在想,这是不是因为不是每个股票都包含在每个时段?有些股票并不总是交易。。。但是这应该会导致空列名和非空列内容。@JinhuaWang“这应该导致空列名”的说法没有意义。想想转置应该如何工作——您正在翻转数据,并期望每个时间/股票代码都有一个记录。如果没有股票代码,那么就没有列标题,但是如果你有一条股票代码的记录,你就会得到一列。我想你需要阅读手册和一些文档。或者玩一玩,看看你用一个小测试数据集得到了什么,这样你就能理解它了。我个人推荐后者。@Reeza我试过加州大学洛杉矶分校的例子,它们似乎奏效了。我还对它进行了处理,删除了一些ID,我确实发现列名仍然存在,但只有一些空列内容。现在我更不确定我的股票数据集上发生了什么。。。似乎没有理由使用空列名称,但我有最后100多个没有名称的列。。。。