R Language
Establecer operaciones
Buscar..
Observaciones
Un conjunto contiene solo una copia de cada elemento distinto. A diferencia de otros lenguajes de programación, la base R no tiene un tipo de datos dedicado para conjuntos. En cambio, R trata un vector como un conjunto tomando solo sus elementos distintos. Esto se aplica a los operadores de conjuntos, setdiff
, intersect
, union
, setequal
y %in%
. Para v %in% S
, solo S
se trata como un conjunto, sin embargo, no el vector v
.
Para un tipo de datos de conjunto verdadero en R, el paquete Rcpp proporciona algunas opciones .
Establecer operadores para pares de vectores.
Comparando conjuntos
En R, un vector puede contener elementos duplicados:
v = "A"
w = c("A", "A")
Sin embargo, un conjunto contiene solo una copia de cada elemento. R trata un vector como un conjunto tomando solo sus elementos distintos, por lo que los dos vectores anteriores se consideran iguales:
setequal(v, w)
# TRUE
Combinando conjuntos
Las funciones clave tienen nombres naturales:
x = c(1, 2, 3)
y = c(2, 4)
union(x, y)
# 1 2 3 4
intersect(x, y)
# 2
setdiff(x, y)
# 1 3
Estos están todos documentados en la misma página ?union
.
Establecer membresía para vectores
El operador %in%
compara un vector con un conjunto.
v = "A"
w = c("A", "A")
w %in% v
# TRUE TRUE
v %in% w
# TRUE
Cada elemento de la izquierda se trata individualmente y se prueba su membresía en el conjunto asociado con el vector de la derecha (que consta de todos sus elementos distintos).
A diferencia de las pruebas de igualdad, %in%
siempre devuelve TRUE
o FALSE
:
c(1, NA) %in% c(1, 2, 3, 4)
# TRUE FALSE
La documentación está en ?`%in%`
.
Productos cartesianos o "cruzados" de vectores.
Para encontrar cada vector de la forma (x, y) donde se dibuja x del vector X e y de Y, usamos expand.grid
:
X = c(1, 1, 2)
Y = c(4, 5)
expand.grid(X, Y)
# Var1 Var2
# 1 1 4
# 2 1 4
# 3 2 4
# 4 1 5
# 5 1 5
# 6 2 5
El resultado es un data.frame con una columna por cada vector que se le pasa. A menudo, queremos tomar el producto cartesiano de conjuntos en lugar de expandir una "cuadrícula" de vectores. Podemos usar unique
, lapply
y do.call
:
m = do.call(expand.grid, lapply(list(X, Y), unique))
# Var1 Var2
# 1 1 4
# 2 2 4
# 3 1 5
# 4 2 5
Aplicando funciones a combinaciones.
Si luego desea aplicar una función a cada combinación resultante f(x,y)
, se puede agregar como otra columna:
m$p = with(m, Var1*Var2)
# Var1 Var2 p
# 1 1 4 4
# 2 2 4 8
# 3 1 5 5
# 4 2 5 10
Este enfoque funciona para todos los vectores que necesitemos, pero en el caso especial de dos, a veces es mejor ajustar el resultado en una matriz, que se puede lograr con el outer
:
uX = unique(X)
uY = unique(Y)
outer(setNames(uX, uX), setNames(uY, uY), `*`)
# 4 5
# 1 4 5
# 2 8 10
Para conceptos y herramientas relacionados, vea el tema de combinatoria.
Hacer únicos / soltar duplicados / seleccionar elementos distintos de un vector
unique
gotas unique
se duplican para que cada elemento del resultado sea único (solo aparece una vez):
x = c(2, 1, 1, 2, 1)
unique(x)
# 2 1
Los valores se devuelven en el orden en que aparecieron por primera vez.
Etiquetas duplicated
cada elemento duplicado:
duplicated(x)
# FALSE FALSE TRUE TRUE TRUE
anyDuplicated(x) > 0L
es una forma rápida de verificar si un vector contiene duplicados.
Medición de superposiciones de conjuntos / diagramas de Venn para vectores
Para contar cuántos elementos de dos conjuntos se superponen, uno podría escribir una función personalizada:
xtab_set <- function(A, B){
both <- union(A, B)
inA <- both %in% A
inB <- both %in% B
return(table(inA, inB))
}
A = 1:20
B = 10:30
xtab_set(A, B)
# inB
# inA FALSE TRUE
# FALSE 0 10
# TRUE 9 11
Se puede usar un diagrama de Venn, ofrecido por varios paquetes, para visualizar los recuentos de superposición en varios conjuntos.