0

对于一个项目,我有一个包含 150 万个条目的大型数据集,我希望通过一些约束变量来聚合一些汽车贷款数据,例如:

国家、货币、ID、固定或浮动、执行、初始贷款价值、汽车类型、汽车制造商

我想知道是否可以通过将数字的初始贷款值相加然后将相似的变量压缩成具有相同观察值的一行来聚合数据,这样我就可以将第一个数据集变成第二个

Country Currency ID Fixed_or_Floating Performing Initial_Value Current_Value 

data have;
set have;
input country $ currency $ ID Fixed $ performing $ initial current;
datalines;

UK       GBP     1   Fixed     Performing          100    50    
UK       GBP     1   Fixed     Performing          150    30   
UK       GBP     1   Fixed     Performing          160    70   
UK       GBP     1   Floating Performing          150    30   
UK       GBP     1   Floating Performing          115    80   
UK       GBP     1   Floating Performing          110    60   
UK       GBP     1   Fixed     Non-Performing   100    50 
UK       GBP     1   Fixed     Non-Performing   120    30  
;
run;

data want;
set have;
input country $ currency $ ID Fixed $ performing $ initial current;
datalines;

UK GBP 1 Fixed Performing 410 150
UK GBP 1 Floating Performing 275 170
UK GBP 1 Fixed Non-performing 220 80
;
run;

本质上是在寻找一种在连接字符变量时对数值求和的方法。

我试过这段代码

proc means data=have sum;
var initial current;
by country currency id fixed performing;
run;

不确定我是否必须使用 proc sql(对于如此大的数据集来说太慢了)或者可能是数据步骤。

任何连接方面的帮助将不胜感激。

4

3 回答 3

1

从结果中创建一个输出数据集Proc MEANS并将其连接起来。带有 BY 语句的 MEANS 需要已排序的数据。你have没有。

将聚合键(那些可爱的分类变量)连接成一个空格分隔的键(不知道为什么需要这样做)可以通过CATX函数来​​完成。

data have_unsorted;
length country $2 currency $3 id 8 type $8 evaluation $20 initial current 8;
input country currency ID type evaluation initial current;
datalines;
UK       GBP     1   Fixed     Performing          100    50    
UK       GBP     1   Fixed     Performing          150    30   
UK       GBP     1   Fixed     Performing          160    70   
UK       GBP     1   Floating Performing          150    30   
UK       GBP     1   Floating Performing          115    80   
UK       GBP     1   Floating Performing          110    60   
UK       GBP     1   Fixed     Non-Performing   100    50 
UK       GBP     1   Fixed     Non-Performing   120    30  
;
run;

方式 1 - 使用 CLASS/WAYS/OUTPUT 表示,使用数据步骤进行后处理

类变量的基数可能会导致问题。

proc means data=have_unsorted noprint;
  class country currency ID type evaluation ;
  ways 5;
  output out=sums sum(initial current)= / autoname;
run;

data want;
  set sums;
  key = catx(' ',country,currency,ID,type,evaluation);
  keep key initial_sum current_sum;
run;

方式 2 - 排序后跟带有 BY/OUTPUT 的 MEANS,带有数据步骤的后处理

BY 语句需要排序的数据。

proc sort data=have_unsorted out=have;
  by country currency ID type evaluation ;

proc means data=have noprint;
  by country currency ID type evaluation ;
  output out=sums sum(initial current)= / autoname;
run;

data want;
  set sums;
  key = catx(' ',country,currency,ID,type,evaluation);
  keep key initial_sum current_sum;
run;

方式 3 - 意思是,给定分组但未排序的数据,使用未排序/输出,使用数据步骤进行后处理

have行将在变量中处理。BY丛是按组具有相同的连续行的序列。

proc means data=have_unsorted noprint;
  by country currency ID type evaluation NOTSORTED;
  output out=sums sum(initial current)= / autoname;
run;

data want;
  set sums;
  key = catx(' ',country,currency,ID,type,evaluation);
  keep key initial_sum current_sum;
run;

方式 4 - DATA 步、DOW 循环、BY NOTSORTED 和键构造

have行将在变量中处理。BY丛是按组具有相同的连续行的序列。

data want_way4;
  do until (last.evaluation);
    set have;
    by country currency ID type evaluation NOTSORTED;
    initial_sum = SUM(initial_sum, initial);
    current_sum = SUM(current_sum, current);
  end;
  key = catx(' ',country,currency,ID,type,evaluation); 
  keep key initial_sum current_sum;
run;

方式 5 - 数据步散列

可以在没有预分类或聚类的情况下处理数据。换句话说,数据可能是完全无序的。

data _null_;
  length key $50 initial_sum current_sum 8;

  if _n_ = 1 then do;
    call missing (key, initial_sum, current_sum);

    declare hash sums();
    sums.defineKey('key');
    sums.defineData('key','initial_sum','current_sum');
    sums.defineDone();
  end;

  set have_unsorted end=end;
  key = catx(' ',country,currency,ID,type,evaluation); 

  rc = sums.find();
  initial_sum = SUM(initial_sum, initial);
  current_sum = SUM(current_sum, current);
  sums.replace();

  if end then
    sums.output(dataset:'have_way5');
run;
于 2018-03-14T13:43:34.250 回答
0

1.5m 个条目不是很大的数据集。首先对数据集进行排序。

proc sort data=have;
by country currency id fixed performing;
run;

proc means data=have sum;
var initial current;
by country currency id fixed performing;
output out=sum(drop=_:) sum(initial)=Initial sum(current)=Current;
run;
于 2018-03-14T13:17:06.383 回答
-1

佩奇米勒的道具

proc summary data=testa nway;
var  net_balance;
class ID fixed_or_floating performing_status initial country currency ;
output out=sumtest sum=sum_initial;
run;
于 2018-03-14T14:00:48.467 回答