【问题标题】:Identify whether missing value equals to mean within group识别缺失值是否等于组内均值
【发布时间】:2020-08-14 03:10:44
【问题描述】:

我在下面有一个数据集:

# 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 == 60M 列中具有相同的编号174,因此它们具有相同的GRP_Mean,给出TRUE。

但是,ID == 61M 列下没有完全相同的值,请给出 FALSE。

我该怎么做?

【问题讨论】:

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


    【解决方案1】:

    我们可以使用%in% 或使用is.naNA 元素创建一个案例

    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。因此,要么对 rounded 或整数值(as.integer(GRP_Mean)[!is.na(M)] == M[!is.na(M)] 或在 cmets 中提到的 @GregorThomas 进行比较,在列之间进行差异,检查差异是否小于 1e-10 或者它是不适用

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

    【讨论】:

    • 可能是Equal := abs(GRP_Mean - M) &lt; 1e-10round 似乎有问题,因为它会说 2 等于 1 和 2 的平均值,因为四舍五入。
    • ID == 60 中的第一个观察得到FLASE,这是不正确的。
    • @PeterChen 我猜你需要any
    • 返回所有TRUE。我觉得需要加by
    猜你喜欢
    • 1970-01-01
    • 2020-05-23
    • 1970-01-01
    • 1970-01-01
    • 2019-08-15
    • 1970-01-01
    • 1970-01-01
    • 2020-08-15
    • 1970-01-01
    相关资源
    最近更新 更多