【问题标题】:Use of na.locf function (zoo package) with .SD in data.table在 data.table 中使用带有 .SD 的 na.locf 函数(zoo 包)
【发布时间】:2015-07-18 14:06:23
【问题描述】:

我正在尝试填写所有 NA,不包括第 1 列和第 4 列的前两个 NA,以及第 2 列和第 3 列的三个 NA,以及最近的非 NA 值。这是我的数据和代码:

  hh<-structure(list(ka = c(NA, NA, 2, NA, NA, 3, NA, NA, NA, NA), 
        kb = c(NA, NA, NA, 2, NA, NA, 3, NA, NA, NA), gc = c(NA, 
        NA, NA, 3, NA, NA, 6, NA, NA, NA), hc = c(NA, NA, 8, NA, 
        NA, NA, 4, NA, NA, NA)), .Names = c("ka", "kb", "gc", "hc"
    ), row.names = c(NA, -10L), class = "data.frame")


library(zoo) #na.locf
library(data.table)

setDT(hh)[,`:=`(ka=c(NA,NA,na.locf(ka)),kb=c(NA,NA,NA,na.locf(kb)),gc=c(NA,NA,NA,na.locf(gc)),hc=c(NA,NA,na.locf(hc)))][]
    ka kb gc hc
 1: NA NA NA NA
 2: NA NA NA NA
 3:  2 NA NA  8
 4:  2  2  3  8
 5:  2  2  3  8
 6:  3  2  3  8
 7:  3  3  6  4
 8:  3  3  6  4
 9:  3  3  6  4
10:  3  3  6  4

但是,我正在寻找将lapply 与.SD 一起使用,因为每种类型都有两列以上。这可能吗?

【问题讨论】:

  • 这也会给出相同的结果na.locf(hh, na.rm = F)
  • @VeerendraGadekar 它会工作,但如果有混合类,我会怀疑输出将类更改为“字符”
  • 感谢@VeerendraGadekar

标签: r data.table zoo


【解决方案1】:

试试

 setDT(hh)[, lapply(.SD, function(x) na.locf(x, na.rm=FALSE))]

或使用set

  for(j in seq_along(hh)){
    set(hh, i=NULL, j=j, value= na.locf(hh[[j]], na.rm=FALSE))
  }

【讨论】:

    【解决方案2】:

    您可以使用setnafill,可从data.table &gt;= 1.12.3获得:

    setnafill(hh, type = "locf")
    hh
    #    ka kb gc hc
    #  1 NA NA NA NA
    #  2 NA NA NA NA
    #  3  2 NA NA  8
    #  4  2  2  3  8
    #  5  2  2  3  8
    #  6  3  2  3  8
    #  7  3  3  6  4
    #  8  3  3  6  4
    #  9  3  3  6  4
    # 10  3  3  6  4
    

    【讨论】:

      【解决方案3】:

      您不需要lapply。这就足够了:

      DT <- as.data.table(hh)
      DT[, na.locf(.SD, na.rm = FALSE)]
      

      给予:

          ka kb gc hc
       1: NA NA NA NA
       2: NA NA NA NA
       3:  2 NA NA  8
       4:  2  2  3  8
       5:  2  2  3  8
       6:  3  2  3  8
       7:  3  3  6  4
       8:  3  3  6  4
       9:  3  3  6  4
      10:  3  3  6  4
      

      这也可以:

      DT[, lapply(.SD, na.locf0)]
      

      【讨论】:

        猜你喜欢
        • 2023-03-20
        • 2019-02-18
        • 1970-01-01
        • 2021-12-10
        • 2019-08-09
        • 2015-06-16
        • 2017-08-23
        • 1970-01-01
        • 2019-11-27
        相关资源
        最近更新 更多