จะบอกได้อย่างไรว่าอะไรอยู่ในเวกเตอร์หนึ่งไม่ใช่เวกเตอร์อื่น?


88

ใน matlab มีวิธีค้นหาค่าในเวกเตอร์หนึ่ง แต่ไม่พบในอีกเวกเตอร์

ตัวอย่างเช่น:

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

มีฟังก์ชั่นใดบ้างที่บอกฉันว่าค่าที่อยู่ในxนั้นไม่ได้yเป็น 1?

คำตอบ:


123

คุณสามารถใช้ฟังก์ชัน setdiff () (set difference):

> setdiff(x, y)
[1] 1

37
Watchout: setdiff(x,y)และsetdiff(y,x)ไม่เหมือนกัน
ซีอาน

59

ใช่. สำหรับเวกเตอร์คุณสามารถใช้ตัว%in%ดำเนินการหรือis.element()ฟังก์ชัน

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

สำหรับเมทริกซ์มีหลายวิธีที่แตกต่างกัน merge()น่าจะตรงไปตรงมาที่สุด ฉันขอแนะนำให้ดูคำถามนี้สำหรับสถานการณ์นั้น


28

ไฟล์วิธีใช้ใน R สำหรับsetdiff, union, intersect, setequal และ is.elementให้ข้อมูลเกี่ยวกับฟังก์ชันชุดมาตรฐานใน R

setdiff(x, y)ผลตอบแทนที่องค์ประกอบของที่ไม่อยู่ในxy

ดังที่ระบุไว้ข้างต้นมันเป็นความแตกต่างที่ไม่สมมาตร ตัวอย่างเช่น:

> 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()เป็นฟังก์ชันที่ยุ่งยากเนื่องจากเอาต์พุตขึ้นอยู่กับลำดับของอินพุต intersectคุณแทนสามารถเขียนฟังก์ชั่นที่เรียบง่ายเช่นที่ไม่ตรงข้ามแน่นอนของ ไกลกว่านี้ดีกว่า

>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

ถ้า:

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

นิพจน์ใด ๆ เหล่านี้:

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

จะให้คำตอบที่เหมาะสม[1] 1ถ้าเป้าหมายคือการหาค่า / ตัวละครในที่ไม่ได้อยู่ในปัจจุบันxy

อย่างไรก็ตามการใช้นิพจน์ข้างต้นอาจเป็นเรื่องยุ่งยากและสามารถให้ผลลัพธ์ที่ไม่ต้องการได้ขึ้นอยู่กับลักษณะของเวกเตอร์และตำแหน่งของ x และ y ในนิพจน์ ตัวอย่างเช่นหาก:

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

และเป้าหมายคือเพื่อค้นหาค่า / อักขระเฉพาะxที่ไม่มีอยู่ในyหรือกลับกัน การใช้นิพจน์เหล่านี้จะยังคงให้คำตอบที่ถูกต้อง[1] 1:

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

ขอบคุณข้อมูลของJeromy Anglim

หรือ:

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

ขอบคุณข้อมูลจากWorkhouse

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.