编辑:我明白为什么这是错误的做法(而且我忘记了我过去是如何做到的)并接受了乔的回答。如果有人对 SAS 中比较更多 if 语句与执行额外分配的性能考虑有任何评论,我仍然会感兴趣。
首选这些方法中的哪一种?
当通过将几个变体/错别字组合成一个正确的值来清理一些数据时,我可以这样做:
选项 A:
if value in (
'A: Wrong Value 1'
'A: Typo 1'
'a: Typo 2'
'A: Wrong Value 2'
) then value = 'A: Correct Value';
else if value in (
'B: Wrong Value 1'
'B: Wrong Value 2'
'B: Typo 1'
) then value = 'B: Correct Value';
else if value in (
'C: Wrong Value 1'
'C: Wrong Value 2'
'C: Wrong Value 3'
'C: Typo 1'
) then value = 'C: Correct Value';
**etc. Assume there are a bunch of similar statements;
**with any number of items on the "in" list;
我在这些操作中看到的问题是,每次遇到“A:正确值”时,都必须通过每个 if 语句来处理它。这不是什么大不了的事,但我觉得“A”组的某些东西仍然会通过所有测试一直运行到“Z”组,这对我来说是错误的。
所以相反,我可以这样写:
选项 B
if value in (
'A: Correct Value'
'A: Wrong Value 1'
'A: Typo 1'
'a: Typo 2'
'A: Wrong Value 2'
) then value = 'A: Correct Value';
else if value in (
'B: Correct Value'
'B: Wrong Value 1'
'B: Wrong Value 2'
'B: Typo 1'
) then value = 'B: Correct Value';
else if value in (
'C: Correct Value'
'C: Wrong Value 1'
'C: Wrong Value 2'
'C: Wrong Value 3'
'C: Typo 1'
) then value = 'C: Correct Value';
这会阻止它评估正确的组(并具有允许您else value = 'Not Cleaned';
在最后添加类似内容的额外优势)。
然而,这个版本最终做了相当于if value = 'A: Correct Value' then value = 'A: Correct Value';
. 这似乎是一种浪费的操作,尽管它可能比继续检查 if 语句更不浪费。
到目前为止,我有:
- 选项 A
- 优点:
- 更短的代码
- 仅重新分配不正确的值(否
if a = 1 then a = 1
)
- 缺点:
- 当一个值不需要被清理时,它必须通过每个 if 语句继续
- 无法以 else 子句结束
- 优点:
- 选项 B
- 优点:
- 对于干净和不干净的值,评估在正确的组处停止。
- 可以使用
else
子句来捕获所有未清理的值(如果您更新基础数据并希望对新值执行其他操作,这很有帮助) - “in”列表包含映射到单个干净值的所有值(如果您以编程方式生成这些值可能会有所帮助)
- 缺点:
- 你必须
if a = 1 then a = 1
做手术; - 代码稍长,因为您必须写出两次正确的值。
- 你必须
- 优点:
我对此的想法是选项 B 是实现这一目标的更好方法。可以访问该else
语句并且不必将干净的“A:正确值”一直发送到 Z 的 if 语句似乎超过了避免if a = 1 then a = 1
构造的任何价值。但我对 SAS 所做的底层活动并不十分熟悉,因此重新分配操作可能比检查一些额外的 if 语句更耗时。