Bir vektörde neyin diğerinde olmadığını nasıl anlarım?


88

Matlab'de bir vektördeki değerleri bulmanın, diğerinde olmayan bir yol vardır.

Örneğin:

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

İçinde xolmayan değerin y1 olduğunu söyleyen herhangi bir işlev var mı?

Yanıtlar:


123

setdiff () (farkı ayarla) işlevini kullanabilirsiniz:

> setdiff(x, y)
[1] 1

37
Dikkat: setdiff(x,y)ve setdiff(y,x)aynı değildir.
Xi'an

59

Evet. Vektörler için sadece %in%operatörü veya is.element()işlevi kullanabilirsiniz.

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

Bir matris için birçok farklı yaklaşım vardır. merge()muhtemelen en yalındır. Bu senaryo için bu soruya bakmanızı öneririm .


28

Setdiff, union, intersect, setequal ve is.element için R'deki yardım dosyası , R'deki standart set fonksiyonları hakkında bilgi sağlar.

setdiff(x, y)xiçinde olmayan öğeleri döndürür y.

Yukarıda belirtildiği gibi, asimetrik bir farktır. Yani mesela:

> 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()zor bir işlevdir çünkü çıktı, girdinin sırasına bağlıdır. Bunun yerine, tam tersini yapan basit bir işlev yazabilirsiniz intersect. Bu çok daha iyi.

>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

Eğer:

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

Bu ifadelerden herhangi biri:

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

doğru cevabı verecektir [1] 1gol değerler / karakterleri bulmak için ise, xmevcut olmadığı, y.

Bununla birlikte, yukarıdaki ifadeleri uygulamak zor olabilir ve vektörün doğasına ve ifadedeki x ve y'nin konumuna bağlı olarak istenmeyen sonuçlar verebilir. Örneğin, eğer:

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

ve amaç sadece içinde xbulunmayan yveya tam tersi olan benzersiz değerleri / karakterleri bulmaktır . Bu ifadelerden herhangi birini uygulamak yine de doğru cevabı verecektir [1] 1:

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

Jeromy Anglim'in katkısına teşekkürler

VEYA:

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

Workhouse katkılarıyla

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.