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
相关产品推荐
相关产品推荐

