dt_fill.Rd
Fills in values, similar to tidyr::fill()
, by within data.table
. This function relies on the
Rcpp
functions that drive tidyr::fill()
but applies them within data.table
.
dt_fill(
dt_,
...,
id = NULL,
.direction = c("down", "up", "downup", "updown"),
immutable = TRUE
)
the data table (or if not a data.table then it is coerced with as.data.table)
the columns to fill
the grouping variable(s) to fill within
either "down" or "up" (down fills values down, up fills values up), or "downup" (down first then up) or "updown" (up first then down)
If TRUE
, dt_
is treated as immutable (it will not be modified in place). Alternatively, you can set immutable = FALSE
to modify the input object.
A data.table with listed columns having values filled in
set.seed(84322)
library(data.table)
x <- 1:10
dt <- data.table(
v1 = x,
v2 = shift(x),
v3 = shift(x, -1L),
v4 = sample(c(rep(NA, 10), x), 10),
grp = sample(1:3, 10, replace = TRUE)
)
dt_fill(dt, v2, v3, v4, id = grp, .direction = "downup")
#> v1 v2 v3 v4 grp
#> <int> <int> <int> <int> <int>
#> 1: 1 2 2 7 2
#> 2: 2 1 3 3 1
#> 3: 3 2 4 7 2
#> 4: 4 3 5 3 1
#> 5: 5 4 6 3 1
#> 6: 6 5 7 3 1
#> 7: 7 6 8 2 3
#> 8: 8 7 9 9 2
#> 9: 9 8 10 9 2
#> 10: 10 9 8 2 3
dt_fill(dt, v2, v3, v4, id = grp)
#> v1 v2 v3 v4 grp
#> <int> <int> <int> <int> <int>
#> 1: 1 2 2 7 2
#> 2: 2 1 3 3 1
#> 3: 3 2 4 7 2
#> 4: 4 3 5 3 1
#> 5: 5 4 6 3 1
#> 6: 6 5 7 3 1
#> 7: 7 6 8 2 3
#> 8: 8 7 9 9 2
#> 9: 9 8 10 9 2
#> 10: 10 9 8 2 3
dt_fill(dt, .direction = "up")
#> v1 v2 v3 v4 grp
#> <int> <int> <int> <int> <int>
#> 1: 1 2 2 7 2
#> 2: 2 1 3 3 1
#> 3: 3 2 4 7 2
#> 4: 4 3 5 3 1
#> 5: 5 4 6 3 1
#> 6: 6 5 7 3 1
#> 7: 7 6 8 2 3
#> 8: 8 7 9 9 2
#> 9: 9 8 10 9 2
#> 10: 10 9 8 2 3