我下面有一个数据集:
# 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 == 61
在M
列下的值不完全相同,为FALSE。
我该怎么办?
答案 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)]