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看起来不起作用,因为我有多个变量,我需要新年变量。是的,但它并不是专门用来回答这些问题的。对一个问题的要求之一,是发布你已经尝试过的东西,而不是仅仅发布一个完整的问题并得到答案。下面有一个答案,但它不能概括过去的数据。上面的答案有效,但我也要用它!上面的一个有效,但我也要玩这个!