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 x
che non y
è in è 1?
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 x
che non y
è in è 1?
Risposte:
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 .
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 x
che 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
x[is.na(match(x,y))]
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
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 y
o 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
setdiff(x,y)
esetdiff(y,x)
non sono la stessa cosa.