gpt4 book ai didi

sas - 在具有许多变量的 SAS 中将大型数据集从长到宽 reshape

转载 作者:行者123 更新时间:2023-12-04 03:58:25 37 4
gpt4 key购买 nike

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

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

我有什么:

属性 年份 Var1 ... Var150

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

2011 年 1 号提案 101 ... DEF

.

.

2017 年第 1 号提案 138 ... XYZ

提案 2 ...

我想要的:

属性 Var1_2010 ... Var1_2017 ... Var150_2010 ... Var150_2017

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

提案 2 ...

我尝试使用 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;

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

最佳答案

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

我首先将其转换为更长的格式,这样您就有了包含您的年份和属性(property) 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;

关于sas - 在具有许多变量的 SAS 中将大型数据集从长到宽 reshape ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63511068/

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