使用 COUNT 函数停止 SAS 对空白单元格进行计数
Posted
技术标签:
【中文标题】使用 COUNT 函数停止 SAS 对空白单元格进行计数【英文标题】:Stop SAS from counting blank cells with COUNT function 【发布时间】:2022-01-20 15:11:50 【问题描述】:我正在编写一个 SAS 查询来 QA 一些数据视图。 QA 的一部分是确定填充值的百分比。不幸的是,SAS 将空字符单元格计算为已填充而不是 NULL 或没有数据。例如,一个 ID 字段有一些空白单元格,我运行一个 COUNT() 函数,我得到的结果与运行一个 COUNT(*) 相同 如果我运行 CASE WHEN 语句来排除 "" 值,我会得到正确的结果,但需要对 SAS 查询中的每个文本字段执行此操作似乎有点过头了,而且我不知道某些功能或某种预处理方式数据,以便 COUNT 函数不会计算空单元格。
提供这个想法的一些示例数据是:
data QA_Test;
Input Name $ ID_Number;
Robert 1AY
Shirley ""
Tammy XB3
【问题讨论】:
使用 PROC FREQ 时是否得到相同的结果? 似乎不太可能,因此需要查看您正在使用的查询的更具体示例。您可以尝试嵌套 TRIMN() 函数。计数(修剪(字符串))。或者使用 MISSING() 函数。总和(缺失(字符串))。您的字符串很可能不是空的,而是只有不可见的字符,例如 TAB 或 'A0'x 不间断空格。 如果变量中有两个双引号字符,那么根据定义它不为空。您是否真的像示例中那样从文本文件中读取数据?如果您想读取示例中的值,请在 INFILE 语句中使用dsd dlm=' '
。
【参考方案1】:
您需要提供一个可重现的示例。请按照说明here 或使用我之前展示的十六进制示例。
所以在某种程度上修复了您发布的非工作代码,我这样做了:
data QA_Test;
Input Name $ ID_Number $;
cards;
Robert 1AY
Shirley ""
Tammy XB3
;;;;
run;
proc sql;
select count(*) as total_count, count(Id_number) as n_id
from QA_TEST;
quit;
结果:
total_count n_id
3 3
但这会在单元格中创建一个带有实际引号的数据集,我假设您的实际数据不是这种情况?因此,如果我将其读为缺失:
data QA_Test;
infile cards truncover;
Input Name $ ID_Number $;
cards;
Robert 1AY
Shirley
Tammy XB3
;;;;
run;
proc sql;
select count(*) as total_count, count(Id_number) as n_id
from QA_TEST;
quit;
结果:
total_count n_id
3 2
所以我认为 SAS 是正确的,您的数据质量测试是正确的,并且您的数据存在需要解决的数据质量问题 - 特别是在这种情况下,可能有标签或 invisible characters in the data 的字段。
您可以使用以下内容对此进行测试,并将您的输出发布在此处或 community.sas.com 上。
proc freq data=qa_test;
table id_number / out=check missing;
format Id_number $hex.;
run;
【讨论】:
请用示例编辑您的问题。并确保使用代码块来确保 html 不会更改您的数据。您可以在此处使用此方法获取数据的精确副本:communities.sas.com/t5/SAS-Communities-Library/…【参考方案2】:在从文本文件中读取带有引号的值时使用 DSD 选项。
data QA_Test;
infile cards dsd dlm=' ' truncover;
input Name $ ID_Number $;
cards;
Robert 1AY
Shirley ""
Tammy XB3
;
现在 ID_NUMBER 将不包含引号。
或者使用句点来表示文本文件中的缺失值。
data QA_Test;
input Name $ ID_Number $;
cards;
Robert 1AY
Shirley .
Tammy XB3
;
如果您的数据中已经有这些 '""'
字符串并且您不想计算它们,那么请使用不同的计算方法。
sum(not (id_number in (' ','""')))
【讨论】:
【参考方案3】:您也可以在count
中使用compress
删除它们,如果将它们留在其中但您不希望它们计数是正确的:
proc sql;
select count(compress(id,'"'))
...
;
quit;
【讨论】:
以上是关于使用 COUNT 函数停止 SAS 对空白单元格进行计数的主要内容,如果未能解决你的问题,请参考以下文章