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.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow