使用 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 对空白单元格进行计数的主要内容,如果未能解决你的问题,请参考以下文章

在EXCEL中,有哪个函数可以统计单元格的个数

单元格函数:countcountAcountBlank

excel求单元格个数的函数是啥

请问sas中scan函数如何使用?

七.Excel统计函数

SQL语句中 聚合函数count()忽略空值么?