Bagaimana cara mengetahui apa yang ada di satu vektor dan bukan yang lain?

88

Dalam matlab ada cara untuk mencari nilai dalam satu vektor tetapi tidak di vektor lainnya.

sebagai contoh:

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

apakah ada fungsi yang akan memberi tahu saya bahwa nilai xyang bukan dalam yadalah 1?

Tony Stark
sumber

Jawaban:

123

Anda dapat menggunakan fungsi setdiff () (set difference):

> setdiff(x, y)
[1] 1
Xela
sumber
37
Awas: setdiff(x,y)dan setdiff(y,x)tidak sama.
Xi'an
59

Iya. Untuk vektor, Anda cukup menggunakan %in%operator atau is.element()fungsi.

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

Untuk matriks, ada banyak perbedaan pendekatan. merge()mungkin yang paling lurus ke depan. Saya sarankan melihat pertanyaan ini untuk skenario itu .

Shane
sumber
28

File bantuan di R untuk setdiff, union, intersect, setequal, dan is.element memberikan informasi tentang fungsi set standar di R.

setdiff(x, y)mengembalikan elemen xyang tidak dalam y.

Seperti disebutkan di atas, ini adalah perbedaan asimetris. Jadi contohnya:

> 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
Jeromy Anglim
sumber
12
x[is.na(match(x,y))]
George Dontas
sumber
5

setdiff()adalah fungsi yang rumit karena keluarannya bergantung pada urutan masukan. Sebagai gantinya, Anda dapat menulis fungsi sederhana yang melakukan kebalikan dari intersect. Ini jauh lebih baik.

>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
Pekerja keras
sumber
2

Jika:

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

Salah satu ekspresi berikut:

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

akan memberi Anda jawaban yang benar [1] 1, jika tujuannya adalah untuk menemukan nilai / karakter di dalamnya x, yang tidak ada di dalamnya y.

Namun, menerapkan ekspresi di atas bisa rumit dan dapat memberikan hasil yang tidak diinginkan tergantung pada sifat vektor, dan posisi x dan y dalam ekspresi tersebut. Misalnya, jika:

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

dan tujuannya hanya untuk menemukan nilai / karakter unik di dalamnya x, yang tidak ada di dalam yatau sebaliknya. Menerapkan salah satu ekspresi berikut akan tetap memberikan jawaban yang benar [1] 1:

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

Terima kasih atas kontribusi Jeromy Anglim

ATAU:

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

Terima kasih atas kontribusi Workhouse

William
sumber