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

SAS中跨行与跨列的简单计算实现方法

SAS跨行计算实现方案

一、当前行存储结构(Type为类别列,amount为值列)

当前数据是长表结构,每个类别对应一行数据,需要先提取各类型的数值再计算,有两种常用方法:

方法1:数据步RETAIN变量存储值

通过RETAIN关键字保留各类型的数值,遍历完所有行后执行计算:

data want;
    set have end=eof;
    /* 声明要保留的变量,存储各类型对应的amount */
    retain Rap_Indlån Puljerneskontantindestående Puljerne_Andre_passiver Axiom_Indlån;
    
    /* 根据Type匹配赋值 */
    select(Type);
        when('Rap_Indlån') Rap_Indlån = amount;
        when('Puljerneskontantindestående') Puljerneskontantindestående = amount;
        when('Puljerne Andre passiver') Puljerne_Andre_passiver = amount;
        when('Axiom_Indlån') Axiom_Indlån = amount;
        otherwise;
    end;
    
    /* 最后一行计算结果并输出 */
    if eof then do;
        result = (Rap_Indlån - Puljerneskontantindestående - Puljerne_Andre_passiver) - Axiom_Indlån;
        output;
    end;
    
    /* 仅保留结果列,按需调整 */
    keep result;
run;

方法2:PROC TRANSPOSE转宽表后计算

先将长表转成宽表(每个类别作为一列),再直接执行计算:

/* 转宽表,自动生成以col_为前缀的列名 */
proc transpose data=have out=have_wide prefix=col_;
    id Type;
    var amount;
run;

/* 基于宽表计算结果 */
data want;
    set have_wide;
    result = (col_Rap_Indlån - col_Puljerneskontantindestående - col_Puljerne_Andre_passiver) - col_Axiom_Indlån;
    keep result;
run;

二、列存储结构(每个Type为单独列)

若数据是宽表结构(每个类别对应一列),直接在数据步中编写计算逻辑即可:

data want;
    set have;
    /* 直接按列名计算 */
    result = (Rap_Indlån - Puljerneskontantindestående - Puljerne_Andre_passiver) - Axiom_Indlån;
    /* 可根据需求保留原始列或仅保留结果列 */
run;

内容的提问来源于stack exchange,提问作者Christoffer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 13:41:13