通过两个变量转置 table
Transpose table by two variables
美好的一天,我遇到了 proc 转置的技术问题。例如我的数据结构如下:
data begin;
input MAKName $ MLOName $ tcode $ Count Percent;
cards;
ABARTH 124 Miss 5 5.1
ABARTH 124 Hit 94 94.9
FIAT 124 Miss 30 12
FIAT 124 Hit 220 88
;run;
我希望将其转置以使行符合以下格式:
MAKName MLOName Count_miss percent_miss Count_hit Percent_hit
ABARTH 124 5 5.0 94 94.9
FIAT 124 30 12 220 88
所以我想将两行压缩为一行。变量或变量名的任何排列都是可以接受的。
我已经设法让点击转置,但第二个变量给我带来了问题。命名也是一个问题,但简单的重命名就可以了。就我而言。
proc transpose data= Begin out= _test prefix=a_ ;
by makname mloname;
var count ;
idlabel tcode;
run; quit;
有没有经验丰富的数据操作者有时间帮忙解决这个问题?
编辑如下:
我的拼贴画想出了用 2x 转置来做到这一点的方法:
proc transpose data=begin out=out1;
by MakName MLOName tcode;
var Count Percent;
run;
proc transpose data=out1 out=out2(drop=_NAME_) delimiter=_;
by MakName MLOName;
var Col1;
id _NAME_ tcode;
run;
恕我直言。
确实有一种方法可以做到这一点 proc transpose
但我没有看到它。
或者,您可以很容易地使用两个 proc transpose
和一个数据步骤 merge
:
data begin;
input MAKName $ MLOName $ tcode $ Count Percent;
cards;
ABARTH 124 Miss 5 5.1
ABARTH 124 Hit 94 94.9
FIAT 124 Miss 30 12
FIAT 124 Hit 220 88
;
run;
proc transpose data=Begin out= count_test(drop=_name_) prefix=Count_;
by makname mloname;
var count;
id tcode;
run;
proc transpose data=Begin out= percent_test(drop=_name_) prefix=Percent_;
by makname mloname;
var percent;
id tcode;
run;
data want;
merge count_test percent_test;
by makname mloname;
run;
请注意,我用 id
语句替换了您的 idlabel
语句,以便根据需要为列创建名称。
编辑:相同的想法减少为一个 proc transpose
但仍需要合并:
data begin;
input MAKName $ MLOName $ tcode $ Count Percent;
cards;
ABARTH 124 Miss 5 5.1
ABARTH 124 Hit 94 94.9
FIAT 124 Miss 30 12
FIAT 124 Hit 220 88
;
run;
proc transpose data=Begin out=test;
by makname mloname;
var count percent;
id tcode;
run;
data want (drop=_name_);
merge test(where=(_name_='Count') rename=(Miss=Count_miss Hit=Count_hit))
test(where=(_name_='Percent') rename=(Miss=Percent_miss Hit=Percent_hit));
by makname mloname;
run;
我将这种数据塑造形式称为多轴心。如您所知,一种传统方法是转置 + 转置。其他技术包括:
- 转置+合并(由user2877959展示)
- 数组(用于静态数据配置)
- 哈希(用于动态数据配置)
- SQL代码生成
无论采用何种技术,数据重塑通常表示报告要求。考虑使用:
- 过程制表
- 过程报告
这里是一个制表例子:
ods listing;
options formchar="|----|+|---+=|-/\<>*";
data have;
input MAKName $ MLOName $ tcode $ Count Percent;
cards;
ABARTH 124 Miss 5 5.1
ABARTH 124 Hit 94 94.9
FIAT 124 Miss 30 12
FIAT 124 Hit 220 88
;run;
proc tabulate data=have;
class MAKName MLOName tcode;
var Count Percent;
table
MAKName * MLOName
,
tcode='' * (Count*max=''*f=8. Percent*max='') / nocellmerge;
run;
ODS 列表输出(HTML 更好,但不能插入 SO)
--------------------------------------------------------------------
| | Hit | Miss |
| |---------------------+---------------------|
| | Count | Percent | Count | Percent |
|----------------------+--------+------------+--------+------------|
|MAKName |MLOName | | | | |
|----------+-----------| | | | |
|ABARTH |124 | 94| 94.90| 5| 5.10|
|----------+-----------+--------+------------+--------+------------|
|FIAT |124 | 220| 88.00| 30| 12.00|
--------------------------------------------------------------------
美好的一天,我遇到了 proc 转置的技术问题。例如我的数据结构如下:
data begin;
input MAKName $ MLOName $ tcode $ Count Percent;
cards;
ABARTH 124 Miss 5 5.1
ABARTH 124 Hit 94 94.9
FIAT 124 Miss 30 12
FIAT 124 Hit 220 88
;run;
我希望将其转置以使行符合以下格式:
MAKName MLOName Count_miss percent_miss Count_hit Percent_hit
ABARTH 124 5 5.0 94 94.9
FIAT 124 30 12 220 88
所以我想将两行压缩为一行。变量或变量名的任何排列都是可以接受的。
我已经设法让点击转置,但第二个变量给我带来了问题。命名也是一个问题,但简单的重命名就可以了。就我而言。
proc transpose data= Begin out= _test prefix=a_ ;
by makname mloname;
var count ;
idlabel tcode;
run; quit;
有没有经验丰富的数据操作者有时间帮忙解决这个问题?
编辑如下: 我的拼贴画想出了用 2x 转置来做到这一点的方法:
proc transpose data=begin out=out1;
by MakName MLOName tcode;
var Count Percent;
run;
proc transpose data=out1 out=out2(drop=_NAME_) delimiter=_;
by MakName MLOName;
var Col1;
id _NAME_ tcode;
run;
恕我直言。
确实有一种方法可以做到这一点 proc transpose
但我没有看到它。
或者,您可以很容易地使用两个 proc transpose
和一个数据步骤 merge
:
data begin;
input MAKName $ MLOName $ tcode $ Count Percent;
cards;
ABARTH 124 Miss 5 5.1
ABARTH 124 Hit 94 94.9
FIAT 124 Miss 30 12
FIAT 124 Hit 220 88
;
run;
proc transpose data=Begin out= count_test(drop=_name_) prefix=Count_;
by makname mloname;
var count;
id tcode;
run;
proc transpose data=Begin out= percent_test(drop=_name_) prefix=Percent_;
by makname mloname;
var percent;
id tcode;
run;
data want;
merge count_test percent_test;
by makname mloname;
run;
请注意,我用 id
语句替换了您的 idlabel
语句,以便根据需要为列创建名称。
编辑:相同的想法减少为一个 proc transpose
但仍需要合并:
data begin;
input MAKName $ MLOName $ tcode $ Count Percent;
cards;
ABARTH 124 Miss 5 5.1
ABARTH 124 Hit 94 94.9
FIAT 124 Miss 30 12
FIAT 124 Hit 220 88
;
run;
proc transpose data=Begin out=test;
by makname mloname;
var count percent;
id tcode;
run;
data want (drop=_name_);
merge test(where=(_name_='Count') rename=(Miss=Count_miss Hit=Count_hit))
test(where=(_name_='Percent') rename=(Miss=Percent_miss Hit=Percent_hit));
by makname mloname;
run;
我将这种数据塑造形式称为多轴心。如您所知,一种传统方法是转置 + 转置。其他技术包括:
- 转置+合并(由user2877959展示)
- 数组(用于静态数据配置)
- 哈希(用于动态数据配置)
- SQL代码生成
无论采用何种技术,数据重塑通常表示报告要求。考虑使用:
- 过程制表
- 过程报告
这里是一个制表例子:
ods listing;
options formchar="|----|+|---+=|-/\<>*";
data have;
input MAKName $ MLOName $ tcode $ Count Percent;
cards;
ABARTH 124 Miss 5 5.1
ABARTH 124 Hit 94 94.9
FIAT 124 Miss 30 12
FIAT 124 Hit 220 88
;run;
proc tabulate data=have;
class MAKName MLOName tcode;
var Count Percent;
table
MAKName * MLOName
,
tcode='' * (Count*max=''*f=8. Percent*max='') / nocellmerge;
run;
ODS 列表输出(HTML 更好,但不能插入 SO)
--------------------------------------------------------------------
| | Hit | Miss |
| |---------------------+---------------------|
| | Count | Percent | Count | Percent |
|----------------------+--------+------------+--------+------------|
|MAKName |MLOName | | | | |
|----------+-----------| | | | |
|ABARTH |124 | 94| 94.90| 5| 5.10|
|----------+-----------+--------+------------+--------+------------|
|FIAT |124 | 220| 88.00| 30| 12.00|
--------------------------------------------------------------------