Recherche…


Remarques

Un ensemble contient une seule copie de chaque élément distinct. Contrairement à d'autres langages de programmation, la base R ne possède pas de type de données dédié pour les ensembles. Au lieu de cela, R traite un vecteur comme un ensemble en ne prenant que ses éléments distincts. Cela s'applique aux opérateurs setdiff , intersect , union , setequal et %in% . Pour v %in% S , seul S est traité comme un ensemble, mais pas le vecteur v .

Pour un vrai type de données défini dans R, le package Rcpp fournit des options .

Définir des opérateurs pour des paires de vecteurs

Comparer des ensembles

Dans R, un vecteur peut contenir des éléments dupliqués:

v = "A"
w = c("A", "A")

Cependant, un ensemble ne contient qu'une seule copie de chaque élément. R traite un vecteur comme un ensemble en ne prenant que ses éléments distincts, donc les deux vecteurs ci-dessus sont considérés comme identiques:

setequal(v, w)
# TRUE

Ensembles combinés

Les fonctions clés ont des noms naturels:

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

Celles-ci sont toutes documentées sur la même page, ?union .

Définir l'appartenance aux vecteurs

L'opérateur %in% compare un vecteur avec un ensemble.

v = "A"
w = c("A", "A")

w %in% v
# TRUE TRUE

v %in% w
# TRUE

Chaque élément de gauche est traité individuellement et testé pour l’appartenance à l’ensemble associé au vecteur de droite (constitué de tous ses éléments distincts).

Contrairement aux tests d'égalité, %in% renvoie toujours TRUE ou FALSE :

c(1, NA) %in% c(1, 2, 3, 4)
# TRUE FALSE

La documentation est à ?`%in%` .

Produits cartésiens ou "croisés" de vecteurs

Pour trouver chaque vecteur de la forme (x, y) où x est tiré du vecteur X et y de Y, nous utilisons 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

Le résultat est un data.frame avec une colonne pour chaque vecteur transmis. Souvent, nous voulons prendre le produit cartésien des ensembles plutôt que d'étendre une "grille" de vecteurs. Nous pouvons utiliser unique , lapply et 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

Application de fonctions aux combinaisons

Si vous souhaitez ensuite appliquer une fonction à chaque combinaison résultante f(x,y) , vous pouvez l'ajouter en tant que colonne supplémentaire:

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

Cette approche fonctionne pour autant de vecteurs que nécessaire, mais dans le cas particulier de deux, il est parfois préférable d’avoir le résultat dans une matrice, ce qui peut être réalisé avec outer :

uX = unique(X)
uY = unique(Y)

outer(setNames(uX, uX), setNames(uY, uY), `*`)

#   4  5
# 1 4  5
# 2 8 10

Pour les concepts et outils associés, voir le sujet de la combinatoire.

Créer des doublons / supprimer / sélectionner des éléments distincts à partir d'un vecteur

unique supprime les doublons pour que chaque élément du résultat soit unique (n'apparait qu'une seule fois):

x = c(2, 1, 1, 2, 1)

unique(x)
# 2 1

Les valeurs sont renvoyées dans l'ordre dans lequel elles sont apparues.

balises duplicated chaque élément dupliqué:

duplicated(x)
# FALSE FALSE TRUE TRUE TRUE

anyDuplicated(x) > 0L est un moyen rapide de vérifier si un vecteur contient des doublons.

Mesures des chevauchements / diagrammes de Venn pour les vecteurs

Pour compter le nombre d'éléments de deux ensembles qui se chevauchent, on pourrait écrire une fonction personnalisée:

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

Un diagramme de Venn, proposé par divers packages, peut être utilisé pour visualiser les comptages de chevauchement sur plusieurs ensembles.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow