识别缺失值是否等于组内的平均值

时间:2020-04-29 21:13:45

标签: r data.table data-manipulation missing-data

我下面有一个数据集:

# dt
Year   ST   CC   ID     M    NonMissing  Tot   GRP_Mean
2004   55   35   60    NA             3    4   174.0000
2005   55   35   60   174             3    4   174.0000
2006   55   35   60   174             3    4   174.0000
2007   55   35   60   174             3    4   174.0000
2004   55   35   61    NA             3    4   158.3333
2005   55   35   61   174             3    4   158.3333
2006   55   35   61   127             3    4   158.3333
2007   55   35   61   174             3    4   158.3333

我按组创建均值,如下所示:

dt[, GRP_Mean := mean(M, na.rm = T), by = .(ST, CC, ID)]

如何确定M是否等于GRP_Mean。例如这样的:

# dt
Year   ST   CC   ID     M    NonMissing  Tot   GRP_Mean    Equal
2004   55   35   60    NA             3    4   174.0000     TRUE
2005   55   35   60   174             3    4   174.0000     TRUE
2006   55   35   60   174             3    4   174.0000     TRUE
2007   55   35   60   174             3    4   174.0000     TRUE
2004   55   35   61    NA             3    4   158.3333    FALSE
2005   55   35   61   174             3    4   158.3333    FALSE
2006   55   35   61   127             3    4   158.3333    FALSE
2007   55   35   61   174             3    4   158.3333    FALSE

ID == 60在列174中具有相同的编号M,因此它们具有相同的GRP_Mean,输入TRUE。

但是,ID == 61M列下的值不完全相同,为FALSE。

我该怎么办?

1 个答案:

答案 0 :(得分:2)

我们可以使用%in%或为NA的{​​{1}}元素加上大小写

is.na

或者可能是

library(data.table)  
dt[, Equal := all(GRP_Mean[!is.na(M)] == M[!is.na(M)]), .(ST, CC, ID)]

注意:双精度值的存在可能会将dt[, Equal : GRP_Mean == M |is.na(M)] 更改为FALSE。因此,可以对==或整数值(round进行比较,也可以按照注释中提到的@GregorThomas进行比较,在各列之间做一个差异,检查差异是否小于1e-10还是不适用

as.integer(GRP_Mean)[!is.na(M)] == M[!is.na(M)]