Come capire cosa c'è in un vettore e non in un altro?


88

In matlab c'è un modo per trovare i valori in un vettore ma non nell'altro.

per esempio:

x <- c(1,2,3,4)
y <- c(2,3,4)

c'è qualche funzione che mi direbbe che il valore in xche non yè in è 1?

Risposte:


123

puoi usare la funzione setdiff () (imposta differenza):

> setdiff(x, y)
[1] 1

37
Watchout: setdiff(x,y)e setdiff(y,x)non sono la stessa cosa.
Xi'an

59

Sì. Per i vettori puoi semplicemente usare l' %in%operatore o la is.element()funzione.

> x[!(x %in% y)]
1

Per una matrice, ci sono molti approcci differenti. merge()è probabilmente il più semplice. Suggerisco di esaminare questa domanda per quello scenario .


28

Il file della guida in R per setdiff, union, intersect, setequal e is.element fornisce informazioni sulle funzioni degli insiemi standard in R.

setdiff(x, y)restituisce gli elementi xche non sono in y.

Come notato sopra, è una differenza asimmetrica. Quindi per esempio:

> x <- c(1,2,3,4)
> y <- c(2,3,4,5)
> 
> setdiff(x, y)
[1] 1
> setdiff(y, x)
[1] 5
> union(setdiff(x, y), setdiff(y, x))
[1] 1 5


5

setdiff()è una funzione complicata perché l'output dipende dall'ordine dell'input. Puoi invece scrivere una semplice funzione in quanto tale che fa l'esatto opposto di intersect. Questo è molto meglio.

>difference <- function(x, y) {
c(setdiff(x, y), setdiff(y, x))
}

#Now lets test it. 
>x <- c(1,2,3,4)
>y <- c(2,3,4,5)

>difference(x,y)
[1] 1 5

2

Se:

x <- c(1,2,3,4)
y <- c(2,3,4)

Ognuna di queste espressioni:

setdiff(x, y)
x[!(x %in% y)]
x[is.na(match(x,y))]
x[!(is.element(x,y))]

ti darà la risposta giusta [1] 1, se l'obiettivo è trovare i valori / caratteri in x, che non è presente iny .

Tuttavia, l'applicazione delle espressioni di cui sopra può essere complicato e può dare risultati indesiderabili a seconda della natura del vettore e della posizione di x e y nell'espressione. Ad esempio, se:

x <- c(1,1,2,2,3,4)
y <- c(2,3,4)

e l'obiettivo è solo quello di trovare i valori / caratteri univoci in x, che non è presente in yo viceversa. L'applicazione di una qualsiasi di queste espressioni darà comunque la risposta giusta [1] 1:

union(setdiff(x, y), setdiff(y, x))

Grazie al contributo di Jeromy Anglim

O:

difference <- function(x, y) {
c(setdiff(x, y), setdiff(y, x))
}
difference(y,x)

Grazie al contributo di Workhouse

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.