【问题标题】:rollmean with grouped data.table returns a logicalrollmean 与分组 data.table 返回一个逻辑
【发布时间】:2020-07-02 00:30:54
【问题描述】:

我在对数据进行分组时尝试在 data.table 中使用包 zoo 中的 rollmean。

当所有组都有足够的数据时,它可以正常工作:

library(data.table)
dt = data.table(x=rep(c("a","b"),10),y=rnorm(20))

dt[,.(ma=rollmean(y, k = 7, fill=NA,align="right")), by = .(x)]

但是当其中一组数据太少时,它会返回错误


dt2 = data.table(x=rep(c("c"),1),y=rnorm(1))

dt3=rbind(dt,dt2)
dt3[,.(ma=rollmean(y, k = 7, fill=NA,align="right")), by = .(x)]

这是错误信息:

第 3 组结果的第 1 列是“逻辑”类型,但需要“双精度”类型。每个组的列类型必须一致。

这似乎是因为当它没有足够的数据时,rollmean 返回一个逻辑(TRUENA 的混合) 鉴于我的数据总是积极的,我使用以下技巧来让我的代码运行

dt4=dt3[,.(ma=rollmean(y, k = 7, fill=-1,align="right")), by = .(x)]
dt4[ma==-1,ma:=NA]
dt4

有合适/更好的方法吗?

【问题讨论】:

    标签: r data.table mean


    【解决方案1】:

    我们可以使用NA_real_ 而不是NA,默认情况下它是NA_logical_

    dt3[x == 'c', class(rollmean(y, k = 7, fill = NA, align = 'right'))] 
    #[1] "logical"
    

    fill 中使用NA_real_,它可以正常工作

    dt3[,.(ma=rollmean(y, k = 7, fill=NA_real_,align="right")), by = .(x)]
    #    x          ma
    # 1: a          NA
    # 2: a          NA
    # 3: a          NA
    # 4: a          NA
    # 5: a          NA
    # 6: a          NA
    # 7: a  0.19653855
    # 8: a -0.05506344
    # 9: a -0.17022022
    #10: a -0.28731762
    #11: b          NA
    #12: b          NA
    #13: b          NA
    #14: b          NA
    #15: b          NA
    #16: b          NA
    #17: b  0.02117906
    #18: b -0.07079598
    #19: b -0.05393943
    #20: b  0.04511924
    #21: c          NA
        x          ma
    

    在其他组中,它也是创建NA,但不同的是,当有非NA元素时,它会被强制转换为数字NA

    【讨论】:

      猜你喜欢
      • 2017-03-17
      • 1970-01-01
      • 2021-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-23
      • 2017-07-27
      • 1970-01-01
      相关资源
      最近更新 更多