如何在SAS中对数据进行子集化?

时间:2014-04-18 04:08:24

标签: loops sas dataset subset

我有一个数据集如下:

1 16.60 4923 1198 29663 1927 Davis California
2 10.09 3055 883 30282 1989 Palo Alto California 
3 9.61 5128 1096 53388 2489 Boulder Colorado 
4 8.85 4674 1210 52815 2600 Berkeley California 
5 7.28 4793 1051 65794 3408 Eugene Oregon 
6 6.64 5112 1215 76972 3579 Fort Collins Colorado 
7 6.59 3125 1608 47451 2701 Santa Barbara California 
8 6.41 2433 1078 37968 2671 Chico California 

变量分别为bike_sharetotal_bikererror_bikertotal_workererror_workercitystate 。对于这个数据集,我想计算骑自行车上班的加利福尼亚人的平均百分比(即,我想总结来自total_biker加利福尼亚的state并将该数字除以{{ 1}})。

首先,我想确定加利福尼亚人,所以我编写了以下total_worker循环来查找来自加利福尼亚州的do人数。 enter image description here     total_bike_cali = 0;     我= 1到8;     如果state =“California”则total_bike_cali = total_bike_cali + total_bike;     否则total_bike_cali = 0;     结束;     proc print;     运行;

然而这给了我一个错误

total_bike

对于循环的几乎每一行。有人可以告诉我我做错了吗?

1 个答案:

答案 0 :(得分:0)

您可以通过多种方式实现这一目标。这是两个。

proc sql;
select sum(total_biker)/sum(total_worker) 
  from your_data
  where state='California';
quit;

data have;
length city state $20;
input bike_share total_biker error_biker total_worker error_worker city $ state $;
datalines;
16.60 4923 1198 29663 1927 Davis California
10.09 3055 883 30282 1989 Palo Alto California 
9.61 5128 1096 53388 2489 Boulder Colorado 
8.85 4674 1210 52815 2600 Berkeley California 
7.28 4793 1051 65794 3408 Eugene Oregon 
6.64 5112 1215 76972 3579 Fort Collins Colorado 
6.59 3125 1608 47451 2701 Santa Barbara California 
6.41 2433 1078 37968 2671 Chico California
;;;;
run;

data want;
set have end=eof;
if state='California' then do;
  total_worker_cali+total_worker;
  total_biker_cali+total_biker;
  put _all_;
end;
if eof then do;
  total_cali_pct = total_biker_cali/total_worker_cali;
  output;
end;
run;

您还可以设置数据,以便PROC MEANSPROC TABULATE可以为您执行此操作;如果您想要每个州,而不仅仅是一个特定的州,那将是这样做的方式。

以下是使用PROC MEANS进行此操作的示例。这并不准确,因为bike_share是圆的;如果你从原始变量重新计算它会更准确。

proc means data=have;
class state;
weight total_worker;
var bike_share;
run;

在这里,您使用total_worker作为权重,将汇总数据集恢复为看起来像每个工人一行的非共享数据集。