SAS中从宽到长的数据集
我有一个数据集,它有多个度量值作为多个时间点 数据如下所示:SAS中从宽到长的数据集,sas,data-cleaning,Sas,Data Cleaning,我有一个数据集,它有多个度量值作为多个时间点 数据如下所示: UserID Var1_2008 Var1_2009 Var1_2010 Var2_2008 Var2_2009 Var2_2010 Race 1 Y N Y 20 30 20 1 2 N N N 15 30 35 0 Year
UserID Var1_2008 Var1_2009 Var1_2010 Var2_2008 Var2_2009 Var2_2010 Race
1 Y N Y 20 30 20 1
2 N N N 15 30 35 0
Year UserID Var1 Var2 Race
2008 1 Y 20 1
2009 1 N 30 1
....
我希望数据如下所示:
UserID Var1_2008 Var1_2009 Var1_2010 Var2_2008 Var2_2009 Var2_2010 Race
1 Y N Y 20 30 20 1
2 N N N 15 30 35 0
Year UserID Var1 Var2 Race
2008 1 Y 20 1
2009 1 N 30 1
....
我该怎么做?我完全迷路了假设所有
var1\u
和var2\u
变量的年份相同,您可以使用数组
data want ;
set have ;
/* Need two arrays, as one is character, the other numeric */
array v1{*} var1_: ; /* wildcard all 'var1_'-prefixed variables */
array v2{*} var2_: ; /* same for var2_ */
/* loop along v1 array */
do i = 1 to dim(v1) ;
/* use vname function to get variable name associated to this array element */
year = input(scan(vname(v1{i}),-1,'_'),8.) ;
var1 = v1{i} ;
var2 = v2{i} ;
output ;
end ;
drop i ;
run ;
数据需求;
集有;
/*需要两个数组,一个是字符,另一个是数字*/
数组v1{*}var1:;/*通配符所有“var1”—前缀变量*/
数组v2{*}var2_2;:;/*var2_也一样*/
/*沿v1阵列循环*/
i=1至变暗(v1);
/*使用vname函数获取与此数组元素关联的变量名*/
年份=输入(扫描(vname(v1{i}),-1,'',8.);
var1=v1{i};
var2=v2{i};
产出;
结束;
第一滴;
跑
可以使用数组,假设所有
var1
和var2
变量的年份相同
data want ;
set have ;
/* Need two arrays, as one is character, the other numeric */
array v1{*} var1_: ; /* wildcard all 'var1_'-prefixed variables */
array v2{*} var2_: ; /* same for var2_ */
/* loop along v1 array */
do i = 1 to dim(v1) ;
/* use vname function to get variable name associated to this array element */
year = input(scan(vname(v1{i}),-1,'_'),8.) ;
var1 = v1{i} ;
var2 = v2{i} ;
output ;
end ;
drop i ;
run ;
数据需求;
集有;
/*需要两个数组,一个是字符,另一个是数字*/
数组v1{*}var1:;/*通配符所有“var1”—前缀变量*/
数组v2{*}var2_2;:;/*var2_也一样*/
/*沿v1阵列循环*/
i=1至变暗(v1);
/*使用vname函数获取与此数组元素关联的变量名*/
年份=输入(扫描(vname(v1{i}),-1,'',8.);
var1=v1{i};
var2=v2{i};
产出;
结束;
第一滴;
跑
这有一个宏!我认为运行以下操作将完全满足您的要求:
filename ut url 'https://raw.githubusercontent.com/FriedEgg/Papers/master/An_Easier_and_Faster_Way_to_Untranspose_a_Wide_File/src/untranspose.sas';
%include ut ;
%untranspose(data=have, out=want, by=UserID, id=year, delimiter=_,
var=Var1 Var2, copy=Race)
这有一个宏!我认为运行以下操作将完全满足您的要求:
filename ut url 'https://raw.githubusercontent.com/FriedEgg/Papers/master/An_Easier_and_Faster_Way_to_Untranspose_a_Wide_File/src/untranspose.sas';
%include ut ;
%untranspose(data=have, out=want, by=UserID, id=year, delimiter=_,
var=Var1 Var2, copy=Race)
你有没有研究过PROC转置?请把你试过的东西也发出来。就像我说的,我完全迷路了。Proc transpose看起来不起作用,因为我有多个变量,我需要新年变量。是的,但它并不是专门用来回答这些问题的。对一个问题的要求之一,是发布你已经尝试过的东西,而不是仅仅发布一个完整的问题并得到答案。下面有一个答案,但它不能概括过去的数据。你有没有研究过PROC转置?请把你试过的东西也发出来。就像我说的,我完全迷路了。Proc transpose看起来不起作用,因为我有多个变量,我需要新年变量。是的,但它并不是专门用来回答这些问题的。对一个问题的要求之一,是发布你已经尝试过的东西,而不是仅仅发布一个完整的问题并得到答案。下面有一个答案,但它不能概括过去的数据。上面的答案有效,但我也要用它!上面的一个有效,但我也要玩这个!