Slovník | Vyhledávání | Mapa webu
 
Základy informatiky pro biologyCvičebnice jazyka R Dokumentace k základním funkcím match

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 NULL: hodnoty, které mají být porovnány. Long vectors jsou podporovány.

table

vektor nebo NULL: hodnoty, proti kterým se má porovnávat. Dlouhé vektory nejsou podporovány.

nomatch

hodnota, která se má vrátit v případě, že není nalezena žádná shoda. Všimněte si, že je konvertována na integer.

incomparables

vektor hodnot, které nelze párovat. Jakékoliv hodnotě v x odpovídající hodnotě v tomto vektoru je přiřazena hodnota nomatch. Z historických důvodů je hodnota FALSE ekvivalentní NULL.

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))

 
vytvořil Institut biostatistiky a analýz Lékařské fakulty Masarykovy univerzity