You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:16:43