使用 RODBC 包计算空值和缺失值
Counting null and missing values using RODBC package
我正在为一个 SQL 数据库创建一个缺失矩阵,该数据库由 5 table 和将近 10 年的数据组成。我已经建立了 ODBC 连接并使用 R 中的 RODBC 包作为我的工作环境。我正在尝试编写一个函数,该函数将为每个 table 输出每年的行数,给定 table 的给定年份中空值(不存在的值)的计数和百分比,以及给定 table 的缺失值(问题 skipped/not 已回答)的计数和百分比。我写了下面的代码,试图让它在一个变量上工作,然后在它工作后把它变成一个函数。但是,当我 运行 这段代码时,总计、缺失值和空值的计数都是相同的,百分比当然是 1。我没有收到任何错误消息。我不确定问题出在哪里,区分这个项目的 missing 和 null 很重要。非常感谢任何见解。
test1 <- sqlQuery(通道, "
SELECT [event_year] AS 'YEAR',
Count(*) AS 'TOTAL',
Count(CASE
WHEN mother_education_trendable = 'NA' THEN 1
ELSE 0
END) AS 'NULL_VAL',
Count(CASE
WHEN mother_education_trendable = -1 THEN 1
ELSE 0
END) AS 'MISS_VAL'
FROM [GA_CMH].[dbo].[births]
GROUP BY [event_year]
ORDER BY [event_year]
")
test1$nullpct<-with(test1, NULL_VAL/TOTAL)
test1$misspct<-with(test1, MISS_VAL/TOTAL)
您当前在 Count
聚合中的 CASE
语句将填充 1
或 0
两者都将被考虑在 Count
聚合中,因此您得到与总数相同。
零是一个值,将被计入 Count
聚合中,因此默认情况下删除 CASE
语句中的 ELSE
部分 NULL
将填充非匹配条件COUNT
总计
中不会 counted/considered
SELECT [event_year] AS 'YEAR',
Count(*) AS 'TOTAL',
Count(CASE
WHEN mother_education_trendable = 'NA' THEN 1
END) AS 'NULL_VAL',
Count(CASE
WHEN mother_education_trendable = -1 THEN 1
END) AS 'MISS_VAL'
FROM [GA_CMH].[dbo].[births]
GROUP BY [event_year]
ORDER BY [event_year]
或使用 SUM
聚合而不是 COUNT
SELECT [event_year] AS 'YEAR',
Count(*) AS 'TOTAL',
SUM(CASE
WHEN mother_education_trendable = 'NA' THEN 1 ELSE 0
END) AS 'NULL_VAL',
SUM(CASE
WHEN mother_education_trendable = -1 THEN 1 ELSE 0
END) AS 'MISS_VAL'
FROM [GA_CMH].[dbo].[births]
GROUP BY [event_year]
ORDER BY [event_year]
我正在为一个 SQL 数据库创建一个缺失矩阵,该数据库由 5 table 和将近 10 年的数据组成。我已经建立了 ODBC 连接并使用 R 中的 RODBC 包作为我的工作环境。我正在尝试编写一个函数,该函数将为每个 table 输出每年的行数,给定 table 的给定年份中空值(不存在的值)的计数和百分比,以及给定 table 的缺失值(问题 skipped/not 已回答)的计数和百分比。我写了下面的代码,试图让它在一个变量上工作,然后在它工作后把它变成一个函数。但是,当我 运行 这段代码时,总计、缺失值和空值的计数都是相同的,百分比当然是 1。我没有收到任何错误消息。我不确定问题出在哪里,区分这个项目的 missing 和 null 很重要。非常感谢任何见解。
test1 <- sqlQuery(通道, "
SELECT [event_year] AS 'YEAR',
Count(*) AS 'TOTAL',
Count(CASE
WHEN mother_education_trendable = 'NA' THEN 1
ELSE 0
END) AS 'NULL_VAL',
Count(CASE
WHEN mother_education_trendable = -1 THEN 1
ELSE 0
END) AS 'MISS_VAL'
FROM [GA_CMH].[dbo].[births]
GROUP BY [event_year]
ORDER BY [event_year]
")
test1$nullpct<-with(test1, NULL_VAL/TOTAL)
test1$misspct<-with(test1, MISS_VAL/TOTAL)
您当前在 Count
聚合中的 CASE
语句将填充 1
或 0
两者都将被考虑在 Count
聚合中,因此您得到与总数相同。
零是一个值,将被计入 Count
聚合中,因此默认情况下删除 CASE
语句中的 ELSE
部分 NULL
将填充非匹配条件COUNT
总计
SELECT [event_year] AS 'YEAR',
Count(*) AS 'TOTAL',
Count(CASE
WHEN mother_education_trendable = 'NA' THEN 1
END) AS 'NULL_VAL',
Count(CASE
WHEN mother_education_trendable = -1 THEN 1
END) AS 'MISS_VAL'
FROM [GA_CMH].[dbo].[births]
GROUP BY [event_year]
ORDER BY [event_year]
或使用 SUM
聚合而不是 COUNT
SELECT [event_year] AS 'YEAR',
Count(*) AS 'TOTAL',
SUM(CASE
WHEN mother_education_trendable = 'NA' THEN 1 ELSE 0
END) AS 'NULL_VAL',
SUM(CASE
WHEN mother_education_trendable = -1 THEN 1 ELSE 0
END) AS 'MISS_VAL'
FROM [GA_CMH].[dbo].[births]
GROUP BY [event_year]
ORDER BY [event_year]