Skip to content

These are methods for the dplyr slice(), slice_head(), slice_tail(), slice_min(), slice_max() and slice_sample() generics. They are translated to the i argument of [.data.table.

Unlike dplyr, slice() (and slice() alone) returns the same number of rows per group, regardless of whether or not the indices appear in each group.

Usage

# S3 method for dtplyr_step
slice(.data, ...)

# S3 method for dtplyr_step
slice_head(.data, ..., n, prop)

# S3 method for dtplyr_step
slice_tail(.data, ..., n, prop)

# S3 method for dtplyr_step
slice_min(.data, order_by, ..., n, prop, with_ties = TRUE)

# S3 method for dtplyr_step
slice_max(.data, order_by, ..., n, prop, with_ties = TRUE)

Arguments

.data

A lazy_dt().

...

Positive integers giving rows to select, or negative integers giving rows to drop.

n, prop

Provide either n, the number of rows, or prop, the proportion of rows to select. If neither are supplied, n = 1 will be used.

If a negative value of n or prop is provided, the specified number or proportion of rows will be removed.

If n is greater than the number of rows in the group (or prop > 1), the result will be silently truncated to the group size. If the proportion of a group size does not yield an integer number of rows, the absolute value of prop*n() is rounded down.

order_by

Variable or function of variables to order by.

with_ties

Should ties be kept together? The default, TRUE, may return more rows than you request. Use FALSE to ignore ties, and return the first n rows.

Examples

library(dplyr, warn.conflicts = FALSE)

dt <- lazy_dt(mtcars)
dt %>% slice(1, 5, 10)
#> Source: local data table [3 x 11]
#> Call:   `_DT36`[c(1, 5, 10)[between(c(1, 5, 10), -.N, .N)]]
#> 
#>     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
#>   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1  21       6  160    110  3.9   2.62  16.5     0     1     4     4
#> 2  18.7     8  360    175  3.15  3.44  17.0     0     0     3     2
#> 3  19.2     6  168.   123  3.92  3.44  18.3     1     0     4     4
#> 
#> # Use as.data.table()/as.data.frame()/as_tibble() to access results
dt %>% slice(-(1:4))
#> Source: local data table [28 x 11]
#> Call:   `_DT36`[(-(1:4))[between(-(1:4), -.N, .N)]]
#> 
#>     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
#>   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1  18.7     8  360    175  3.15  3.44  17.0     0     0     3     2
#> 2  18.1     6  225    105  2.76  3.46  20.2     1     0     3     1
#> 3  14.3     8  360    245  3.21  3.57  15.8     0     0     3     4
#> 4  24.4     4  147.    62  3.69  3.19  20       1     0     4     2
#> 5  22.8     4  141.    95  3.92  3.15  22.9     1     0     4     2
#> 6  19.2     6  168.   123  3.92  3.44  18.3     1     0     4     4
#> # … with 22 more rows
#> 
#> # Use as.data.table()/as.data.frame()/as_tibble() to access results

# First and last rows based on existing order
dt %>% slice_head(n = 5)
#> Source: local data table [5 x 11]
#> Call:   `_DT36`[rlang::seq2(1L, min(5L, .N))]
#> 
#>     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
#>   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1  21       6   160   110  3.9   2.62  16.5     0     1     4     4
#> 2  21       6   160   110  3.9   2.88  17.0     0     1     4     4
#> 3  22.8     4   108    93  3.85  2.32  18.6     1     1     4     1
#> 4  21.4     6   258   110  3.08  3.22  19.4     1     0     3     1
#> 5  18.7     8   360   175  3.15  3.44  17.0     0     0     3     2
#> 
#> # Use as.data.table()/as.data.frame()/as_tibble() to access results
dt %>% slice_tail(n = 5)
#> Source: local data table [5 x 11]
#> Call:   `_DT36`[rlang::seq2(.N - min(5L, .N) + 1L, .N)]
#> 
#>     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
#>   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1  30.4     4  95.1   113  3.77  1.51  16.9     1     1     5     2
#> 2  15.8     8 351     264  4.22  3.17  14.5     0     1     5     4
#> 3  19.7     6 145     175  3.62  2.77  15.5     0     1     5     6
#> 4  15       8 301     335  3.54  3.57  14.6     0     1     5     8
#> 5  21.4     4 121     109  4.11  2.78  18.6     1     1     4     2
#> 
#> # Use as.data.table()/as.data.frame()/as_tibble() to access results

# Rows with minimum and maximum values of a variable
dt %>% slice_min(mpg, n = 5)
#> Source: local data table [5 x 11]
#> Call:   `_DT36`[rank(mpg, ties.method = "min", na.last = "keep") <= min(5L, 
#>     .N)][order(mpg)]
#> 
#>     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
#>   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1  10.4     8   472   205  2.93  5.25  18.0     0     0     3     4
#> 2  10.4     8   460   215  3     5.42  17.8     0     0     3     4
#> 3  13.3     8   350   245  3.73  3.84  15.4     0     0     3     4
#> 4  14.3     8   360   245  3.21  3.57  15.8     0     0     3     4
#> 5  14.7     8   440   230  3.23  5.34  17.4     0     0     3     4
#> 
#> # Use as.data.table()/as.data.frame()/as_tibble() to access results
dt %>% slice_max(mpg, n = 5)
#> Source: local data table [5 x 11]
#> Call:   `_DT36`[rank(desc(mpg), ties.method = "min", na.last = "keep") <= 
#>     min(5L, .N)][order(-mpg)]
#> 
#>     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
#>   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1  33.9     4  71.1    65  4.22  1.84  19.9     1     1     4     1
#> 2  32.4     4  78.7    66  4.08  2.2   19.5     1     1     4     1
#> 3  30.4     4  75.7    52  4.93  1.62  18.5     1     1     4     2
#> 4  30.4     4  95.1   113  3.77  1.51  16.9     1     1     5     2
#> 5  27.3     4  79      66  4.08  1.94  18.9     1     1     4     1
#> 
#> # Use as.data.table()/as.data.frame()/as_tibble() to access results

# slice_min() and slice_max() may return more rows than requested
# in the presence of ties. Use with_ties = FALSE to suppress
dt %>% slice_min(cyl, n = 1)
#> Source: local data table [11 x 11]
#> Call:   `_DT36`[rank(cyl, ties.method = "min", na.last = "keep") <= min(1L, 
#>     .N)][order(cyl)]
#> 
#>     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
#>   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1  22.8     4 108      93  3.85  2.32  18.6     1     1     4     1
#> 2  24.4     4 147.     62  3.69  3.19  20       1     0     4     2
#> 3  22.8     4 141.     95  3.92  3.15  22.9     1     0     4     2
#> 4  32.4     4  78.7    66  4.08  2.2   19.5     1     1     4     1
#> 5  30.4     4  75.7    52  4.93  1.62  18.5     1     1     4     2
#> 6  33.9     4  71.1    65  4.22  1.84  19.9     1     1     4     1
#> # … with 5 more rows
#> 
#> # Use as.data.table()/as.data.frame()/as_tibble() to access results
dt %>% slice_min(cyl, n = 1, with_ties = FALSE)
#> Source: local data table [1 x 11]
#> Call:   `_DT36`[rank(cyl, ties.method = "first", na.last = "keep") <= 
#>     min(1L, .N)][order(cyl)]
#> 
#>     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
#>   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1  22.8     4   108    93  3.85  2.32  18.6     1     1     4     1
#> 
#> # Use as.data.table()/as.data.frame()/as_tibble() to access results

# slice_sample() allows you to random select with or without replacement
dt %>% slice_sample(n = 5)
#> Source: local data table [5 x 11]
#> Call:   `_DT36`[sample.int(.N, min(min(5L, .N), .N))]
#> 
#>     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
#>   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1  19.2     8  400    175  3.08  3.84  17.0     0     0     3     2
#> 2  19.2     6  168.   123  3.92  3.44  18.3     1     0     4     4
#> 3  22.8     4  108     93  3.85  2.32  18.6     1     1     4     1
#> 4  21.4     6  258    110  3.08  3.22  19.4     1     0     3     1
#> 5  21       6  160    110  3.9   2.62  16.5     0     1     4     4
#> 
#> # Use as.data.table()/as.data.frame()/as_tibble() to access results
dt %>% slice_sample(n = 5, replace = TRUE)
#> Source: local data table [5 x 11]
#> Call:   `_DT36`[sample.int(.N, min(5L, .N), replace = TRUE)]
#> 
#>     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
#>   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1  21       6   160   110  3.9   2.62  16.5     0     1     4     4
#> 2  13.3     8   350   245  3.73  3.84  15.4     0     0     3     4
#> 3  15.5     8   318   150  2.76  3.52  16.9     0     0     3     2
#> 4  27.3     4    79    66  4.08  1.94  18.9     1     1     4     1
#> 5  15.5     8   318   150  2.76  3.52  16.9     0     0     3     2
#> 
#> # Use as.data.table()/as.data.frame()/as_tibble() to access results

# you can optionally weight by a variable - this code weights by the
# physical weight of the cars, so heavy cars are more likely to get
# selected
dt %>% slice_sample(weight_by = wt, n = 5)
#> Source: local data table [5 x 11]
#> Call:   `_DT36`[sample.int(.N, min(min(5L, .N), .N), prob = wt)]
#> 
#>     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
#>   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1  17.8     6  168.   123  3.92  3.44  18.9     1     0     4     4
#> 2  19.7     6  145    175  3.62  2.77  15.5     0     1     5     6
#> 3  15.5     8  318    150  2.76  3.52  16.9     0     0     3     2
#> 4  10.4     8  472    205  2.93  5.25  18.0     0     0     3     4
#> 5  21.4     4  121    109  4.11  2.78  18.6     1     1     4     2
#> 
#> # Use as.data.table()/as.data.frame()/as_tibble() to access results