我有一个数据表:
(f <- data.table(id1=c(1,2,3,1,2,3),
v=c(1,NA,NA,2,3,4),
key="id1"))
id1 v
1: 1 1
2: 1 2
3: 2 NA
4: 2 3
5: 3 NA
6: 3 4
当我尝试从组中的当前值设置缺少v
时:
> f[,v[is.na(v)] := v[which(!is.na(v))[1]], by="id1"]
Error in eval(expr, envir, enclos) : object 'v' not found
Calls: [ -> [.data.table -> eval -> eval
显然,我错过了很简单的事情......
答案 0 :(得分:3)
这是一个解决方案:
f[, v:={
ok <- !is.na(v)
ifelse(ok,v,v[ok][1])
}, by=id1]
请注意,如果v
对于一个群组完全NA
,则会保持这种状态:
f <- data.table(id1=c(1,2,3,1,2,3),v=c(1,NA,NA,2,3,4),key="id1")
ff <- rbind(f,list(4L,NA),list(4L,NA))
ff[,v:={ok <- !is.na(v);ifelse(ok,v,v[ok][1])},by=id1]