合并和合并SAS

时间:2015-07-03 09:00:09

标签: sas

我有一张SAS表,如:

DATA test; 
   INPUT id sex $ age inc r1 r2 Zaehler work $; 
   DATALINES; 
 1  F  35 17  7 2 1 w
17  M  40 14  5 5 1 w
33  F  35  6  7 2 1 w
49  M  24 14  7 5 1 w
65  F  52  9  4 7 1 w
81  M  44 11  7 7 1 w
2   F  35 17  6 5 1 n
18  M  40 14  7 5 1 n
34  F  47  6  6 5 1 n
50  M  35 17  5 7 1 w
; 
PROC PRINT; RUN;

proc sort data=have;
by county;
run;

如果性别和年龄相等,我希望比较行,并在Zaehler上建立总和。例如:

1 F 35 17 7 2 1 w

33 F 35 6 7 2 1 w

性别= f和年龄= 35等于所以我想将它们合并为:

id sex age inc r1 r2 Zaehler work
 1 F 35 17 7 2 2 w

我以为我可以用proc sql做到但我不能在proc sql中使用sum。有人可以帮助我吗?

5 个答案:

答案 0 :(得分:4)

PROC SUMMARY是计算统计数据的常用方法。

AssertionError: expected Object {
errors: Object {
  firstName: Object {
    kind: 'required',
    message: 'Path `firstName` is required.',
    name: 'ValidatorError',
    path: 'firstName',
    properties: Object {
      message: 'Path `{PATH}` is required.',
      path: 'firstName',
      type: 'required'
    },
  }
},
message: 'User validation failed',
name: 'ValidationError',
} to have property path
  at Test.<anonymous> (test/userTests.js:23:25)
  at net.js:1276:10

为什么要在输出中包含SEX,AGE和Zaehler以外的变量?

答案 1 :(得分:3)

您的要求并不难理解或满足,但是,我不确定您这样做的强调理由是什么。更多地了解您的目的可能有助于促进从项目的根源起作用的更好的答案。虽然我有一种感觉,PROC MEAN可能会为您提供更好的矩阵,但这里有一个PROC SQL解决方案,可以为您提供摘要以及保留“第一行的价值”:

proc sql;
create table want as
select id, sex , age, inc, r1, r2, sum(Zaehler) as Zaehler, work
from test
group by sex, age
having id = min(id) /*This is tell SAS only to keep the row with the smallest id within the same sex,age group*/
;
quit;

答案 2 :(得分:2)

你可以使用proc sql来总结性别和年龄

proc sql;
create table sum as 
select 
    sex
    ,age
    ,sum(Zaehler) as Zaehler_sum
from test 
    group by 
    sex
    ,age;
quit;

如果要包含所有变量

,可以将其加入主表
proc sql;
create table test_With_Sum as 
select 
    t.*
    ,s.Zaehler_sum
from test t
    inner join sum s on t.sex = s.sex
    and t.age = s.age
    order by
    t.sex
    ,t.age
;
quit;

如果您愿意,可以将其全部编写为一个proc sql查询,并且不需要订单,只是为了更好地查看汇总结果而添加

答案 3 :(得分:1)

不是一个好的解决方案。但它应该给你一些想法。

DATA test; 
   INPUT id sex $ age inc r1 r2 Zaehler work $; 
   DATALINES; 
 1  F  35 17  7 2 1 w
17  M  40 14  5 5 1 w
33  F  35  6  7 2 1 w
49  M  24 14  7 5 1 w
65  F  52  9  4 7 1 w
81  M  44 11  7 7 1 w
2   F  35 17  6 5 1 n
18  M  40 14  7 5 1 n
34  F  47  6  6 5 1 n
50  M  35 17  5 7 1 w
; 
run; 

data t2;
    set test;
    nobs = _n_;
run;

proc sort data=t2;by descending sex descending age descending nobs;run;

data t3;
    set t2;
    by descending sex descending age;
    if first.age then count = 0;
    count + 1;
    zaehler = count;
    if last.age then output;
run;

proc sort data=t3 out=want(drop=nobs count);by nobs sex age;run;

答案 4 :(得分:0)

感谢您的帮助。这是我的最终代码。

    proc sql;
create table sum as 
select distinct
    sex
    ,age
    ,sum(Zaehler) as Zaehler
from test 
WHERE work = 'w'
    group by 
    sex
    ,age
    ;
PROC PRINT;quit;

我只是稍微修改一下代码。我过滤了w并且我使用相同的值合并了列。 这只是一个例子,真正的数据更大,有更多的列和行。