当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


R match 价值匹配


R语言 match 位于 base 包(package)。

说明

match 返回第一个参数在第二个参数中的(第一个)匹配位置的向量。

%in% 是一个更直观的二元运算符接口,它返回一个逻辑向量,指示其左操作数是否匹配。

用法

match(x, table, nomatch = NA_integer_, incomparables = NULL)

x %in% table

参数

x

矢量或NULL:要匹配的值。支持Long vectors

table

矢量或NULL:要匹配的值。不支持Long vectors

nomatch

未找到匹配项时返回的值。请注意,它被强制为 integer

incomparables

无法匹配的值向量。 x 中与该向量中的值匹配的任何值都被分配为nomatch 值。由于历史原因, FALSE 相当于 NULL

细节

%in%目前定义为
"%in%" <- function(x, table) match(x, table, nomatch = 0) > 0

因子、原始向量和列表转换为字符向量,内部分类对象通过以下方式转换mtfrm, 进而xtable被强制转换为通用类型(中的两种类型中的后者)R的排序,逻辑<整数<数字<复杂<字符)在匹配之前。如果incomparables具有正长度,它被强制为普通类型。

列表匹配可能非常慢,最好避免,除非是简单的情况。

确切地说,什么与什么相匹配在某种程度上是一个定义问题。对于所有类型,NANA 匹配,且不匹配其他值。对于实数和复数值, NaN 值被视为匹配任何其他 NaN 值,但不匹配 NA ,其中对于复数 x ,实部和虚部必须两者匹配(除非至少包含一个 NA)。

如果任何输入被标记为 "bytes" ,则字符串将作为字节序列进行比较,否则,如果它们采用不同的编码,但在转换为 UTF-8 时会一致,则被视为相等(请参阅 Encoding )。

%in% 永远不会返回 NA,这使得它在 if 条件下特别有用。

x 长度相同的向量。

match :如果存在匹配,则给出第一个匹配项在 table 中的位置的整数向量,否则为 nomatch

如果发现 x[i] 等于 table[j] ,则返回值的第 i 位置返回的值是 j ,对于可能的最小 j 。如果未找到匹配项,则值为 nomatch

%in% :逻辑向量,指示是否为 x 的每个元素找到匹配项:因此值为 TRUEFALSE 而不是 NA

例子

## The intersection of two sets can be defined via match():
## Simple version:
## intersect <- function(x, y) y[match(x, y, nomatch = 0)]
intersect # the R function in base is slightly more careful
intersect(1:10, 7:20)

1:10 %in% c(1,3,5,9)
sstr <- c("c","ab","B","bba","c",NA,"@","bla","a","Ba","%")
sstr[sstr %in% c(letters, LETTERS)]

"%w/o%" <- function(x, y) x[!x %in% y] #--  x without y
(1:10) %w/o% c(3,7,12)
## Note that setdiff() is very similar and typically makes more sense:
        c(1:6,7:2) %w/o% c(3,7,12)  # -> keeps duplicates
setdiff(c(1:6,7:2),      c(3,7,12)) # -> unique values

## Illuminating example about NA matching
r <- c(1, NA, NaN)
zN <- c(complex(real = NA , imaginary =  r ), complex(real =  r , imaginary = NA ),
        complex(real =  r , imaginary = NaN), complex(real = NaN, imaginary =  r ))
zM <- cbind(Re=Re(zN), Im=Im(zN), match = match(zN, zN))
rownames(zM) <- format(zN)
zM ##--> many "NA's" (= 1) and the four non-NA's (3 different ones, at 7,9,10)

length(zN) # 12
unique(zN) # the "NA" and the 3 different non-NA NaN's
stopifnot(identical(unique(zN), zN[c(1, 7,9,10)]))

## very strict equality would have 4 duplicates (of 12):
symnum(outer(zN, zN, Vectorize(identical,c("x","y")),
                     FALSE,FALSE,FALSE,FALSE))
## removing "(very strictly) duplicates",
i <- c(5,8,11,12)  # we get 8 pairwise non-identicals :
Ixy <- outer(zN[-i], zN[-i], Vectorize(identical,c("x","y")),
                     FALSE,FALSE,FALSE,FALSE)
stopifnot(identical(Ixy, diag(8) == 1))

参考

Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988) The New S Language. Wadsworth & Brooks/Cole.

也可以看看

pmatchcharmatch 用于(部分)字符串匹配, match.arg 等用于函数参数匹配。 findInterval 类似地返回位置向量,但查找区间内的数字,而不是精确匹配。

is.element 相当于 %in% 的 S-compatible 。

unique (和 duplicated )使用与 match() 相同的 “match” 或 “equality” 定义,并且这些定义不如 == 严格,例如,对于数字或数字中的 NANaN复杂的向量,或具有不同编码的字符串,另请参见上文。

相关用法


注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Value Matching。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。