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