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?

Jawaban:


123

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

> setdiff(x, y)
[1] 1

37
Awas: setdiff(x,y)dan setdiff(y,x)tidak sama.
Xi'an


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


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

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.