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.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow