微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在SAS中将具有多个变量的大型数据集从长到大重塑

如何解决在SAS中将具有多个变量的大型数据集从长到大重塑

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

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

我所拥有的:

属性 年份 Var1 ... Var150

2010年第1期提案100 ... ABC

2011年1月1日的提案... 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的每个变量多次出现。这样做的缺点还在于会丢失每个变量的格式。

解决方法

我认为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;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。