【问题标题】:Reshaping a large dataset from long to wide in SAS with many variables在具有许多变量的 SAS 中将大型数据集从长到宽重塑
【发布时间】:2020-08-20 18:18:58
【问题描述】:

我在 SAS 中有一个大型数据集,需要将其从 long 更改为 wide。

基本上,数据是根据每个属性的多个观测值进行排序的,这些观测值大约 10 个不同的年份,包含大约 150 个变量。我想这样做,所以每个变量都是不同的年份,并且每个属性都有一个观察值。每个变量都有唯一的名称,我想将名称保留在其中。

我有什么:

属性 年份 Var1 ... Var150

Prop 1 2010 100 ... ABC

Prop 1 2011 101 ... DEF

.

.

Prop 1 2017 138 ... XYZ

Prop2 ...

我想要什么:

属性 Var1_2010 ... Var1_2017 ... Var150_2010 ... Var150_2017强>

Prop1 100 ... 138 ... ABC ... XYZ

Prop2 ...

我尝试使用 Proc Transpose,但找不到在每个原始变量名称末尾连接年份的方法。

我也试过了:

proc sort data=hotels;
by propertyID year;
run;

proc transpose data=hotels out=hotels_wide;
by propertyID year;
var _all_;
run;

proc transpose data=hotels_wide delimiter=_ out=hotels_wide_full(drop=_name_);
by propertyID;
var col1;
id _name_ year;
run;

但最后一个块给了我一个错误,告诉我每个 propertyID 的每个变量多次出现。这样做的一个缺点是会丢失每个变量的格式。

【问题讨论】:

  • 您发布的代码将起作用。您能否提供不起作用的示例数据?
  • 发布的代码会产生该错误的唯一原因是,如果现有变量的名称太长,以至于添加额外的字符来存储年份值将不符合 32 个字符的限制变量名。

标签: sas reshape


【解决方案1】:

我认为 PROC TRANSPOSE 在这里确实有效。这似乎对我有用,但我可能遗漏了您的代码。

我首先将其转换为更长的格式,这样您就有一列数据,其中包含您的年份和属性 ID。然后我再次将其转换为所需的宽格式。

只要每个属性每年只有一行,就可以了。如果它出错了,那么出于某种原因,SAS 认为你有多年的变量,这是有问题的,因为你不能有 Var4_2010 和 var4_2010 两次,那么第二次迭代应该如何命名?在这种情况下,您要么汇总然后转置,要么需要添加另一个变量来唯一标识您的行。

data propertyData;
    array _var(*) var1-var5;

    do property=1 to 5;

        do year=2010 to 2015;

            do i=1 to dim(_var);
                _var(i)=rand('normal', 100, 5);
            end;
            output;
        end;
    end;
    keep property year var1-var5;
run;

proc transpose data=propertyData out=long;
by property year;
var var1-var5;
run;

proc transpose data=long out=wide delimiter = _;
by property;
id  _name_ year;
var col1;
run;

【讨论】:

  • 有趣!我不知道。是的,这更简洁:)
猜你喜欢
  • 2018-06-15
  • 1970-01-01
  • 1970-01-01
  • 2015-11-05
  • 1970-01-01
  • 2020-08-17
  • 2020-07-12
  • 2011-03-20
  • 1970-01-01
相关资源
最近更新 更多