【问题标题】:How to subset data in SAS?如何在 SAS 中对数据进行子集化?
【发布时间】:2014-06-02 13:20:20
【问题描述】:

我有一个数据集如下:

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。对于这个数据集,我想计算骑自行车上班的加利福尼亚人的平均百分比(即,我想将来自state 加利福尼亚的total_biker 相加,然后将该数字除以total_worker 的总和)。

首先我想识别加利福尼亚人,所以我编写了以下do 循环来查找来自加利福尼亚的total_bike 的数量。 total_bike_cali=0; 做 i=1 到 8; 如果 state="California" 那么 total_bike_cali=total_bike_cali+total_bike; 否则total_bike_cali=0; 结尾; 过程打印; 运行;

但是这给了我一个错误

 Statement is not valid or it is used out of proper order.

对于循环的几乎每一行。谁能告诉我我做错了什么?

【问题讨论】:

  • SAS 为您处理逐行迭代。你像矩阵语言一样思考。您也不在该代码中的数据步骤中,因此没有任何代码是有效的。

标签: loops sas dataset subset


【解决方案1】:

您可以通过多种方式做到这一点。这里有两个。

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 作为权重,以使汇总的数据集看起来像一个未汇总的数据集,每个工人一行。

【讨论】:

  • 感谢您的回复。对于第二种方法,是否需要初始化变量total_worker_calitotal_biker_cali?否则他们就不会被正确定义?
  • 不,它们没问题。以这种方式使用的 + 运算符将自动保留它们,并自动初始化正确设置它们。这只是真的,因为我将它用作增量运算符,而不是在等号之后。
  • 我明白了。嗯,有些事情不太正常。我注意到有一个除以 0:eof=1 Bike_Share_Commuters=6.41 Total_Bike=2433 Margin_Error_Biker=1078 Total_Workers=37968 Margin_Error_Worker=2671 city=Chico state=California total_worker_cali=0 total_biker_cali=0 total_cali_pct=. _ERROR_=1 _N_=8
  • 您是否修正了变量名称以正确匹配您的?
  • 是的,我做到了。这就是我所拥有的data want; set biker_data end=eof; if state='California' then do; total_worker_cali+Total_Workers; total_biker_cali+Total_Bike; end; if eof then do; total_cali_pct = total_biker_cali/total_worker_cali; output; end; run;
猜你喜欢
  • 1970-01-01
  • 2017-11-21
  • 2019-09-26
  • 1970-01-01
  • 2023-03-09
  • 2021-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多