match
位于 base
包(package)。 说明
match
返回第一个参数在第二个参数中的(第一个)匹配位置的向量。
%in%
是一个更直观的二元运算符接口,它返回一个逻辑向量,指示其左操作数是否匹配。
用法
match(x, table, nomatch = NA_integer_, incomparables = NULL)
x %in% table
参数
x |
矢量或 |
table |
矢量或 |
nomatch |
未找到匹配项时返回的值。请注意,它被强制为 |
incomparables |
无法匹配的值向量。 |
细节
%in%
目前定义为
"%in%" <- function(x, table) match(x, table, nomatch = 0) > 0
因子、原始向量和列表转换为字符向量,内部分类对象通过以下方式转换mtfrm
, 进而x
和table
被强制转换为通用类型(中的两种类型中的后者)R的排序,逻辑<整数<数字<复杂<字符)在匹配之前。如果incomparables
具有正长度,它被强制为普通类型。
列表匹配可能非常慢,最好避免,除非是简单的情况。
确切地说,什么与什么相匹配在某种程度上是一个定义问题。对于所有类型,NA
与 NA
匹配,且不匹配其他值。对于实数和复数值, 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
的每个元素找到匹配项:因此值为 TRUE
或 FALSE
而不是 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.
也可以看看
pmatch
和 charmatch
用于(部分)字符串匹配, match.arg
等用于函数参数匹配。 findInterval
类似地返回位置向量,但查找区间内的数字,而不是精确匹配。
is.element
相当于 %in%
的 S-compatible 。
unique
(和 duplicated
)使用与 match()
相同的 “match” 或 “equality” 定义,并且这些定义不如 ==
严格,例如,对于数字或数字中的 NA
和 NaN
复杂的向量,或具有不同编码的字符串,另请参见上文。
相关用法
- R match.arg 使用部分匹配的参数验证
- R match.call 参数匹配
- R match.fun 提取名称指定的函数
- R matrix 矩阵
- R matmult 矩阵乘法
- R mat.or.vec 创建矩阵或向量
- R make.unique 使字符串唯一
- R maxCol 求矩阵中的最大位置
- R mapply 将函数应用于多个列表或向量参数
- R marginSums 计算表格边距
- R make.names 命名语法上有效的名称
- R mtfrm 匹配辅助函数
- R merge 合并两个 DataFrame
- R missing 正式论证有价值吗?
- R mode 对象的(存储)模式
- R message 诊断信息
- R mean 算术平均值
- R memlimits 查询和设置堆大小限制
- R memCompress 内存中压缩和解压缩
- R memory.profile 分析 Cons 单元的使用情况
- R file.path 构造文件路径
- R grep 模式匹配和替换
- R getwd 获取或设置工作目录
- R vector 向量 - 创建、强制等
- R lapply 对列表或向量应用函数
注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Value Matching。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。