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.