Returns a lookup table or list of the positions of ALL matches of its first
argument in its second and vice versa. Similar to match, though
that function only returns the first match.
Arguments
- x
vector. The values to be matched. Long vectors are not currently supported.
- y
vector. The values to be matched. Long vectors are not currently supported.
- all.x
logical; if
TRUE, then each value inxwill be included even if it has no matching values iny- all.y
logical; if
TRUE, then each value inywill be included even if it has no matching values inx- list
logical. If
TRUE, the result will be returned as a list of vectors, each vector being the matching values in y. IfFALSE, result is returned as a data.table with repeated values for each match.- indexes
logical. Whether to return the indices of the matches or the actual values.
- nomatch
the value to be returned in the case when no match is found. If not provided and
indexes=TRUE, items with no match will be represented asNA. If set toNULL, items with no match will be set to an index value oflength+1. Ifindexes=FALSE, they will default toNA.
Details
This behavior can be imitated by using joins to create lookup tables, but
matches is simpler and faster: usually faster than the best joins in
other packages and thousands of times faster than the built in
merge.
all.x/all.y correspond to the four types of database joins in the
following way:
- left
all.x=TRUE,all.y=FALSE- right
all.x=FALSE,all.y=TRUE- inner
all.x=FALSE,all.y=FALSE- full
all.x=TRUE,all.y=TRUE
Note that NA values will match other NA values.
Source of the function: https://github.com/cran/grr/blob/master/R/grr.R
Examples
mat_elem <- data.table::data.table(
DrugName = rep(c("untreated", "drugA", "drugB", "untreated"), 2),
DrugName_2 = rep(c("untreated", "vehicle", "drugA", "drugB"), 2),
clid = rep(c("C1", "C2"), each = 4)
)
untreated_tag <- gDRutils::get_env_identifiers("untreated_tag")
ref_idx <- which(
mat_elem$DrugName %in% untreated_tag |
mat_elem$DrugName_2 %in% untreated_tag
)
ref <- mat_elem[ref_idx, ]
treated <- mat_elem[-ref_idx, ]
valid <- c("DrugName", "DrugName_2")
trt <- lapply(valid, function(x) {
colnames <- c("clid", x)
treated[, colnames, with = FALSE]
})
trt <- do.call(paste,
do.call(rbind, lapply(trt, function(x) setNames(x, names(trt[[1]]))))
)
ref <- lapply(valid, function(x) {
colnames <- c("clid", x)
ref[, colnames, with = FALSE]
})
ref <- do.call(paste,
do.call(rbind, lapply(ref, function(x) setNames(x, names(ref[[1]]))))
)
grr_matches(trt, ref, list = FALSE, all.y = FALSE)
#> x y
#> <int> <int>
#> 1: 3 2
#> 2: 1 9
#> 3: 4 5
#> 4: 2 12