我有一个data.table,其中的列如下:c(58,NA,NA,NA,NA,13,NA,NA,NA,12,23,NA,12)
我想通过向后携带下一个非NA值,只填充列中每个非NA值之前的两个NA。结果应为:c(58,NA,NA,13,13,13,NA,12,12,12,23,12,12)
我设法做到了:
dt = data.table(V1 = c(58,NA,NA,NA,NA,13,NA,NA,NA,12,23,NA,12))
dt[, rleid:=rleid(dt$V1)]
dt[, num := seq(.N), rleid]
u=1
arr = c()
for (i in 1:(nrow(dt)-1)){
if(dt$rleid[i] == dt$rleid[i+1]){
u=u+1
next
}
else{
arr = append(arr,u)}
u=1
}
arr=append(arr,1)
v=c()
for (i in 1:(length(arr))){
for (j in 1:arr[i]){
v=append(v,arr[i])
}
}
dt[, len:=v]
dt[, val:=len-num]
dt[, V2 := fifelse(is.na(V1) & val<=1, nafill(V1, "nocb"), V1)]
此解决方案对于大数据表来说耗时太长。有没有更快的建议?
3条答案
按热度按时间x9ybnkn61#
一个快速而肮脏的
data.table
解决方案:kfgdxczn2#
您可以通过两次反转向量来修改给定的函数here,即
pvcm50d13#
另一个data.table解决方案: