如何用PROC TRANSPOSE将CDC人口数据的种族族裔长表转宽表?
使用PROC TRANSPOSE实现CDC人口数据长转宽
完全可以用PROC TRANSPOSE实现这个长格式到宽格式的转换,核心是先把Race和Eth合并成目标列名格式的变量,再进行转置操作,具体步骤如下:
步骤1:合并种族族裔变量
先通过DATA步把Race和Eth两个字段合并成一个新变量,用来作为转置后的列名:
data cdc_pop_long; set your_input_dataset; /* 替换成你的原始数据集名称 */ Race_Eth = catx('/', Race, Eth); /* 用斜杠合并两个变量,自动去除前后空格 */ run;
这里catx函数会自动处理Eth字段可能存在的多余空格(比如示例里的AI/AN H),生成符合要求的AI/AN/H格式的列名变量。
步骤2:使用PROC TRANSPOSE转置
指定State和Year作为分组的BY变量,合并后的Race_Eth作为ID变量(控制新列名),Pop作为要转置的数值变量:
proc transpose data=cdc_pop_long out=cdc_pop_wide(drop=_name_); by State Year; /* 按州和年份分组,每组转成一行 */ id Race_Eth; /* 用合并后的变量作为新列名 */ var Pop; /* 要转置的人口数据列 */ run;
drop=_name_是去掉转置过程中自动生成的_NAME_列(该列默认值为Pop,无实际意义)- 转置后的输出数据集
cdc_pop_wide就会呈现你需要的宽格式:每行对应一个州+年份的组合,各种族族裔的人口数作为单独列。
结果示例
转置后的数据集结构会和你给出的目标格式完全一致:
State Year White/NH Black/NH Asian/NH AI/AN/H Alabama 2010 xxxx xxxx xxxx xxxx
内容的提问来源于stack exchange,提问作者Ryan
相关产品推荐
相关产品推荐

