SAS技术咨询:是否用Proc Transpose将宽格式问题数据转长格式
解决方案:将宽格式SAS数据集转换为长格式
嘿,你的需求完全可以实现,PROC TRANSPOSE是可行的方法,不过用数组来处理可能更直观,尤其是当你有很多类似的问题字段时。我给你两种方案参考:
第一步:先定义原始数据集
首先我们把你给出的原始数据整理成SAS可识别的格式(缺失值用.填充):
data have; input ID survey Q1 q1_2 Q2 q2_2 Q3 q3_2; datalines; 1 1 1 0 1 1 . . 2 0 1 1 2 2 . . 1 1 1 0 . . . . ; run;
方案一:使用PROC TRANSPOSE
这种方法需要先将每个问题的两个变量(比如Q1和q1_2)进行转置,再整理出目标字段:
/* 第一步:转置所有Q开头的变量 */ proc transpose data=have out=transposed prefix=Response; by ID survey; var Q1 q1_2 Q2 q2_2 Q3 q3_2; run; /* 第二步:提取问题编号,过滤缺失值 */ data want; set transposed; /* 从_NAME_变量中提取问题编号:比如Q1→1,q1_2→1 */ Q = input(scan(_NAME_, 1, 'qQ_'), best.); /* 只保留有响应值的行 */ if not missing(Response1); keep ID survey Q Response1; rename Response1=Response; run;
方案二:使用数组(更灵活高效)
如果你有大量类似的问题字段,数组方法不需要手动罗列所有变量,扩展性更好:
data want; set have; /* 定义两个数组:分别存储两次调查的问题值 */ array qs[3] Q1-Q3; array qs2[3] q1_2-q3_2; /* 遍历每个问题,输出两次调查的响应行 */ do i=1 to dim(qs); Q = i; Response = qs[i]; if not missing(Response) then output; Response = qs2[i]; if not missing(Response) then output; end; drop i Q1-Q3 q1_2-q3_2; run;
两种方法最终都会生成你需要的长格式数据集,其中:
ID和survey保留原始分组信息Q表示问题编号(1/2/3)Response对应该问题在不同调查时间的回答值
如果你的目标格式中Q代表的是调查批次(比如1=第一次,2=第二次),只需要调整代码里的Q赋值逻辑即可——把Q设为1或2,而非问题编号。
内容的提问来源于stack exchange,提问作者a.s.1
相关产品推荐
相关产品推荐

