【问题标题】:Pivot translation in SAS SQL, more simply?SAS SQL 中的枢轴翻译,更简单?
【发布时间】:2020-11-17 06:38:57
【问题描述】:

我正在尝试在 SAS proc SQL 中进行数据透视转换,并且我已经获得了所需的数据集。 但我正在寻找更简单的程序,没有重复的程序“max(case when NO = # then ### end) as ##”,或者更好的方法。如果你有好的,请给我一些建议。

data test;
input ID $ NO TIM $;
cards;
1   1   8:31
1   2   8:32
1   3   8:33
1   4   8:34
2   1   8:35
2   2   8:36
2   3   8:37
2   4   8:38
3   1   8:41
3   2   8:42
3   3   8:43
3   4   8:44
;
run;

proc sql;
 create table test2 as
 select ID,
        max(case when NO = 1 then TIM end) as A1,
        max(case when NO = 2 then TIM end) as B1,
        max(case when NO = 3 then TIM end) as C1,
        max(case when NO = 4 then TIM end) as D1
 from test group by ID;
quit;

/*
test2 : I want this dataset

ID  A1      B1      C1      D1
1   8:31    8:32    8:33    8:34
2   8:35    8:36    8:37    8:38
3   8:41    8:42    8:43    8:44
*/

【问题讨论】:

  • 这对我来说看起来很简单。
  • 为什么不直接使用 PROC TRANSPOSE?
  • 同意@Tom。前提是 SQL 是糟糕且危险的解决方案。
  • @crow16384,为什么向 SQL 提供一个糟糕而危险的解决方案
  • @Parfait,SAS SQL 非常出色且功能强大,但问题的解决方案带有一些不好的想法:1)没有默认值的情况; 2) 隐式将字符数据转换为带最大值的数字 - 危险,更好地使用输入函数; 3) 提供的 SQL 不是灵活(硬编码)的解决方案。 PROC TRANSPOSE 让您避免所有此类问题并使代码灵活。

标签: sql sas


【解决方案1】:

看起来像一个简单的转置步骤。您可以使用 ID 语句告诉它使用一个或多个变量的值来构造变量名称。您可以使用 PREFIX= 选项设置变量的基本名称。因此,此代码将从您的示例数据中生成名为 VAR1、VAR2、VAR3 和 VAR4 的变量。

proc transpose data=test out=want(drop=_name_) prefix=VAR ;
  by id;
  id no;
  var tim;
run;

如果您希望变量以您显示的方式命名,那么您将需要构建一些方法将 1 转换为“A1”,将 2 转换为“B1”等。例如,您可以定义映射 1 的格式到“A1”。

proc format ;
  value abc 1='A1' 2='B1' 3='C1' 4='D1';
run;

proc transpose data=test out=want(drop=_name_);
  by id;
  id no;
  var tim;
  format no abc.;
run;

【讨论】:

  • 感谢您的回答!这将非常有帮助。还有大家,感谢您提供有用的建议和讨论。
猜你喜欢
  • 2013-12-28
  • 1970-01-01
  • 1970-01-01
  • 2010-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多