
match
Párování hodnot
match {base} | Dokumentace R v češtině |
Popis
match
vrací vektor poloh (prvních) shod prvního argumentu ve svém druhém.
%in%
je intuitivnější rozhraní jako binární operátor, který vrací vektor typu logical, který označuje, zda existuje shoda pro jeho levý operand, nebo ne.
Použití
match(x, table, nomatch = NA_integer_, incomparables = NULL)
x %in% table
Argumenty
x |
vektor nebo |
table |
vektor nebo |
nomatch |
hodnota, která se má vrátit v případě, že není nalezena žádná shoda. Všimněte si, že je konvertována na |
incomparables |
vektor hodnot, které nelze párovat. Jakékoliv hodnotě v |
Detaily
%in%
je v současné době definováno jako
"%in%" <- function(x, table) match(x, table, nomatch = 0) > 0
Faktory, originální vektory a seznamy jsou převedeny na znakové vektory a poté jsou x
a tabulka
konvertovány na běžný typ (pozdější ze dvou typů v uspořádání R, logical < integer < numeric < complex < character) před párováním. Pokud mají incomparables
kladnou délku, je konvertovány na společný typ.
Párování seznamů je potenciálně velmi pomalé a nejlépe je se tomu vyhnout, s výjimkou jednoduchých případů.
Co přesně odpovídá čemu, je do určité míry otázkou definice. Pro všechny typy, NA
odpovídá NA
a žádné jiné hodnotě. Pro reální a komplexní hodnoty se hodnoty NaN
považují za odpovídající jakýmkoli jiným hodnotám NaN
, ale neodpovídají NA
, kde pro komplexní x
, musí odpovídat reální i imaginární části(pokud neobsahují alespoň jednu NA
).
Znakové řetězce budou porovnány jako bajtové sekvence, pokud je jakýkoli vstup označen jako "bajty"
, a jinak jsou považovány za rovnocenné, pokud jsou v různých kódováních, ale budou souhlasit při překladu do UTF-8 (viz Encoding
).
To, že %in%
nikdy nevrací NA
je zvlášť užitečné v podmínkách.
Hodnota
Vektor o stejné délce jako x
.
match
: vektor typu integer udávající pozici v tabulce
první shody, pokud existuje shoda, jinak nomatch
.
Pokud je x[i]
shodné s table[j]
, pak hodnota vrácená v i
-té poloze návratové hodnoty je j
, pro nejmenší možné j
. Pokud není nalezena žádná shoda, je tato hodnota nomatch
.
%in%
: vektor typu logical, který označuje, zda byla nalezena shoda pro každý prvek x
: takto jsou hodnoty TRUE
nebo FALSE
a nikdy NA
.
Reference
Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988) The New S Language. Wadsworth & Brooks/Cole.
Viz také
pmatch
a charmatch
pro (parciální) párování řetězců, match.arg
, atd. pro párování argumentů funkcí. findInterval
podobně vrátí vektor pozic, ale najde čísla v intervalech, spíše než přesné shody.
is.element
pro S-kompatibilní ekvivalent %in%
.
unique
(a duplicated
) používají stejné definice “shody” nebo “rovnosti” jako match()
, a jsou méně přísná než ==
, např., pro NA
a NaN
ve komplexních vektorech nebo typu numeric, nebo pro řetězce s různým kódováním , viz také výše.
Příklady
## Průnik dvou množin může být definován pomocí match():
## Jednoduchá verze:
## 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)
## Všimněte si, že setdiff () je velmi podobný a typicky dává větší smysl:
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
## Osvětlující příklad o párování NA
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 ##--> mnoho "NA" (= 1) a čtyři ne-NA's (3 různé, na 7,9,10)
length(zN) # 12
unique(zN) # "NA" a 3 různé ne-NA NaN
stopifnot(identical(unique(zN), zN[c(1, 7,9,10)]))
## velmi přísná rovnost by měla 4 duplikáty (z 12):
symnum(outer(zN, zN, Vectorize(identical,c("x","y")),
FALSE,FALSE,FALSE,FALSE))
## odstranění "(velmi přísné) duplikátů",
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))