sds
sds

Reputation: 60014

cannot manipulate a column in a data.table

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

Answers (1)

Frank
Frank

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

Related Questions