forked from tidyverse/dplyr
-
Notifications
You must be signed in to change notification settings - Fork 0
/
select-utils.R
54 lines (41 loc) · 1.27 KB
/
select-utils.R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
starts_with <- function(vars, match, ignore.case = TRUE) {
stopifnot(is.string(match), !is.na(match), nchar(match) > 0)
if (ignore.case) match <- tolower(match)
n <- nchar(match)
if (ignore.case) vars <- tolower(vars)
which(substr(vars, 1, n) == match)
}
ends_with <- function(vars, match, ignore.case = TRUE) {
stopifnot(is.string(match), !is.na(match), nchar(match) > 0)
if (ignore.case) match <- tolower(match)
n <- nchar(match)
if (ignore.case) vars <- tolower(vars)
length <- nchar(vars)
which(substr(vars, pmax(1, length - n + 1), length) == match)
}
contains <- function(vars, match, ignore.case = TRUE) {
stopifnot(is.string(match), nchar(match) > 0)
if (ignore.case) {
vars <- tolower(vars)
match <- tolower(match)
}
grep(match, vars, fixed = TRUE)
}
matches <- function(vars, match, ignore.case = TRUE) {
stopifnot(is.string(match), nchar(match) > 0)
grep(match, vars, ignore.case = ignore.case)
}
num_range <- function(vars, prefix, range, width = NULL) {
if (!is.null(width)) {
range <- sprintf(paste0("%0", width, "d"), range)
}
match(paste0(prefix, range), vars)
}
one_of <- function(vars, ...) {
keep <- c(...)
stopifnot(is.character(keep))
match(keep, vars)
}
everything <- function(vars) {
seq_along(vars)
}