使用do循环在数据步骤中删除丢失的数据

时间:2018-09-23 19:45:51

标签: sas

我正在SAS中读取不完整的数据,并且在do循环中跳过缺少的值时遇到问题。

我当前的代码是:

data rcb_missing_LM;
 input blk @@;
 do trt=1,2,3;
  input y @@;
  if y=. then delete;
  else output;
 end;
cards;
1 47.2 . 49.4
2 . 56.6 53.6
;

我想要得到的输出是:

| obs | blk | trt | y    |
|-----|-----|-----|------|
| 1   | 1   | 1   | 47.2 |
| 2   | 1   | 3   | 49.4 |
| 3   | 2   | 2   | 56.6 |
| 4   | 2   | 3   | 53.6 |

相反,我得到以下信息:

| obs | blk  | trt | y    |
|-----|------|-----|------|
| 1   | 1.0  | 1   | 47.2 |
| 2   | 49.4 | 1   | 2.0  |
| 3   | 56.6 | 1   | 53.6 |

我最好的猜测是DELETE命令抛出了trt变量。

有人可以给我一些解决方法的指导吗?

2 个答案:

答案 0 :(得分:4)

您正确的认为DELETE语句是问题的原因。 DELETE语句停止DATA步骤循环的当前迭代,并继续进行DATA步骤的下一次迭代。您要做的是停止已编码的DO循环的当前迭代,并继续进行DO循环的下一个迭代。为此,请使用CONTINUE语句。因此,您可以将其编码为:

data rcb_missing_LM;
 input blk @;
 do trt=1,2,3;
  input y @;
  if y=. then continue;
  else output;
 end;
cards;
1 47.2 . 49.4
2 . 56.6 53.6
;

我也将输入语句更改为以单个@而不是@@结尾。双尾@保留DATA步骤的所有迭代中的输入记录。在这种情况下,它不会造成伤害(除了有关SAS的注释超过输入行末尾时转到下一行的注释之外),但这不是必需的。在DATA步骤的第一次迭代中,您读取了第一条输入记录上的所有值。在DATA步骤的第二次迭代中,只有一个尾随@,指针会自动转到第二个输入记录,然后读取这些值。

答案 1 :(得分:3)

您根本不需要//SEND PUSH TO PROVIDERS let orderQuery = PFQuery(className: "ProvidersOnline") orderQuery.whereKey("location", nearGeoPoint: self.location, withinKilometers: 2.5) orderQuery.whereKey("fulfilling", equalTo: false) //orderQuery.order(byAscending: "createdAt") orderQuery.findObjectsInBackground(block: {(objects, error) -> Void in print("PROVIDER PUSH QUERY") print(objects?.count) print(error) if objects?.count != 0 && error == nil { print("PROVIDER PUSH SENT") if let objects = objects { for object in objects { print("order query objects are") print(objects) print("order query done") let vehicle = object["location"] as! PFGeoPoint let distance: Double = self.location.distanceInKilometers(to: vehicle) let format = ".1" // Send push notification to query let pushMessage = "Someone requested a ride \(distance.format(format)) km away!" PFCloud.callFunction(inBackground: "providerPush", withParameters: ["message": pushMessage, "location": vehicle]) { (success, error) -> Void in if error != nil { print("error is not nil") print(error!) } else { print("push success") print(success!) } } } } } }) 语句。如果您有明确的DELETE语句,则SAS在数据步骤循环结束时不会自动输出。

OUTPUT

或者颠倒逻辑,您不需要else语句。

if y=. then ;
else output;