Reputation: 60014
I have a data table:
(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
when I try to set missing v
from the present value in the group:
> 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
Obviously, I am missing something very simple...
Upvotes: 1
Views: 62
Reputation: 66819
This is one solution:
f[, v:={
ok <- !is.na(v)
ifelse(ok,v,v[ok][1])
}, by=id1]
Note that if v
is entirely NA
for one group, it will stay that way:
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]
Upvotes: 3