Use of na.locf function (zoo package) with .SD in data.table

牧云@^-^@ 提交于 2019-12-20 03:17:22

问题


I am trying to fill out all NA's excluding the first two NA's for cols 1 and 4 and three NA's for cols 2 and 3 with most recent non-NA value . Here is my data and code:

  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

However, I am looking for use of lapply with .SD as I have more than two columns for each type. Is this possible?


回答1:


Try

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

Or use set

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



回答2:


You don't need lapply. This is sufficient:

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

giving:

    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

This will also work:

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



回答3:


You can use setnafill, available from data.table >= 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


来源:https://stackoverflow.com/questions/31491976/use-of-na-locf-function-zoo-package-with-sd-in-data-table

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!