Определите, равно ли пропущенное значение значению в группе - PullRequest
1 голос
/ 30 апреля 2020

У меня есть набор данных ниже:

# 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, укажите ЛОЖЬ.

Как я могу это сделать?

1 Ответ

2 голосов
/ 30 апреля 2020

Мы можем либо использовать %in%, либо создать чехол для NA элементов с 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)]

ПРИМЕЧАНИЕ. Наличие: двойные значения могут изменить == на ЛОЖЬ. Так что, либо проведите сравнение по round ed или целочисленному значению (as.integer(GRP_Mean)[!is.na(M)] == M[!is.na(M)], либо как @GregorThomas, упомянутое в комментариях, сделайте разницу между столбцами, проверьте, если разница меньше 1e-10, или это NA

dt[, Equal := abs(GRP_Mean - M) < 1e-10 |!is.na(M)]
...