我正在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变量。
有人可以给我一些解决方法的指导吗?
答案 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;