R Language
Imposta le operazioni
Ricerca…
Osservazioni
Un set contiene solo una copia di ciascun elemento distinto. A differenza di altri linguaggi di programmazione, la base R non ha un tipo di dati dedicato per i set. Invece, R tratta un vettore come un insieme prendendo solo i suoi elementi distinti. Questo vale per gli operatori di set, setdiff
, intersect
, union
, setequal
e %in%
. Per v %in% S
, solo S
è trattato come un insieme, tuttavia, non il vettore v
.
Per un tipo di dati set reale in R, il pacchetto Rcpp fornisce alcune opzioni .
Imposta gli operatori per coppie di vettori
Confronto di set
In R, un vettore può contenere elementi duplicati:
v = "A"
w = c("A", "A")
Tuttavia, un set contiene solo una copia di ciascun elemento. R considera un vettore come un insieme prendendo solo i suoi elementi distinti, quindi i due vettori sopra sono considerati uguali:
setequal(v, w)
# TRUE
Combinazione di set
Le funzioni chiave hanno nomi naturali:
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
Questi sono tutti documentati nella stessa pagina ?union
.
Imposta l'appartenenza per i vettori
L'operatore %in%
confronta un vettore con un set.
v = "A"
w = c("A", "A")
w %in% v
# TRUE TRUE
v %in% w
# TRUE
Ogni elemento a sinistra viene trattato individualmente e testato per l'appartenenza all'insieme associato al vettore a destra (costituito da tutti i suoi elementi distinti).
A differenza dei test di uguaglianza, %in%
restituisce sempre TRUE
o FALSE
:
c(1, NA) %in% c(1, 2, 3, 4)
# TRUE FALSE
La documentazione è a ?`%in%`
.
Prodotti cartesiani o "incrociati" di vettori
Per trovare ogni vettore del modulo (x, y) dove x è disegnato dal vettore X e y da Y, usiamo 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
Il risultato è un data.frame con una colonna per ogni vettore passato ad esso. Spesso, vogliamo prendere il prodotto cartesiano delle serie piuttosto che espandere una "griglia" di vettori. Possiamo usare unique
, lapply
e 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
Applicazione di funzioni a combinazioni
Se poi vuoi applicare una funzione a ciascuna combinazione risultante f(x,y)
, può essere aggiunta come un'altra colonna:
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
Questo approccio funziona per tutti i vettori di cui abbiamo bisogno, ma nel caso particolare di due, a volte è meglio adattarsi per ottenere il risultato in una matrice, che può essere ottenuto con outer
:
uX = unique(X)
uY = unique(Y)
outer(setNames(uX, uX), setNames(uY, uY), `*`)
# 4 5
# 1 4 5
# 2 8 10
Per concetti e strumenti correlati, vedere l'argomento combinatorics.
Crea duplicati univoci / drop / seleziona elementi distinti da un vettore
gocce unique
duplicate in modo che ogni elemento nel risultato sia unico (appare solo una volta):
x = c(2, 1, 1, 2, 1)
unique(x)
# 2 1
I valori vengono restituiti nell'ordine in cui sono comparsi per la prima volta.
tag duplicated
ogni elemento duplicato:
duplicated(x)
# FALSE FALSE TRUE TRUE TRUE
anyDuplicated(x) > 0L
è un modo rapido per verificare se un vettore contiene duplicati.
Set di sovrapposizioni di misurazione / diagrammi di Venn per vettori
Per contare quanti elementi di due set si sovrappongono, si potrebbe scrivere una funzione personalizzata:
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 diagramma di Venn, offerto da vari pacchetti, può essere utilizzato per visualizzare i conteggi di sovrapposizione su più set.