Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 使用data.table中带有.SD的na.locf函数(zoo包)_R_Data.table_Zoo - Fatal编程技术网

R 使用data.table中带有.SD的na.locf函数(zoo包)

R 使用data.table中带有.SD的na.locf函数(zoo包),r,data.table,zoo,R,Data.table,Zoo,我试图用最新的非NA值填写所有NA,不包括cols 1和4的前两个NA以及cols 2和3的三个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(N

我试图用最新的非NA值填写所有NA,不包括cols 1和4的前两个NA以及cols 2和3的三个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
hh试试看

或使用
set

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

您可以使用
setnafill
,可从
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

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

DT <- as.data.table(hh)
DT[, na.locf(.SD, na.rm = FALSE)]
这也将有助于:

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

这也将给出相同的结果
na.locf(hh,na.rm=F)
@VeerendraGadekar它会工作,但如果存在混合类,我会怀疑输出会将类更改为“character”,谢谢@VeerendraGadekar
    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)]