Làm thế nào để biết những gì nằm trong một vectơ này và không phải là một vectơ khác?


86

Trong matlab có một cách để tìm các giá trị trong một vectơ nhưng không phải trong vectơ kia.

ví dụ:

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

có chức năng nào cho tôi biết rằng giá trị trong xđó không phải ylà 1 không?

Câu trả lời:


122

bạn có thể sử dụng hàm setdiff () (đặt chênh lệch):

> setdiff(x, y)
[1] 1

37
Watchout: setdiff(x,y)setdiff(y,x)không giống nhau.
Tây An

59

Đúng. Đối với vectơ, bạn có thể chỉ cần sử dụng %in%toán tử hoặc is.element()hàm.

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

Đối với một ma trận, có nhiều cách tiếp cận khác nhau. merge()có lẽ là thẳng tiến nhất. Tôi đề nghị xem xét câu hỏi này cho kịch bản đó .


28

Tệp trợ giúp trong R cho setdiff, union, giao nhau, setequal và is.element cung cấp thông tin về các hàm bộ tiêu chuẩn trong R.

setdiff(x, y)trả về các phần tử xkhông có trong y.

Như đã nói ở trên, đó là một sự khác biệt không đối xứng. Ví dụ:

> 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()là một hàm phức tạp vì đầu ra phụ thuộc vào thứ tự của đầu vào. Thay vào đó, bạn có thể viết một hàm đơn giản như vậy hoàn toàn ngược lại với intersect. Điều này tốt hơn nhiều.

>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

Nếu:

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

Bất kỳ biểu thức nào sau đây:

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

sẽ cung cấp cho bạn câu trả lời đúng [1] 1, nếu mục tiêu là tìm các giá trị / ký tự trong x, giá trị đó không có trong y.

Tuy nhiên, việc áp dụng các biểu thức trên có thể phức tạp và có thể cho kết quả không mong muốn tùy thuộc vào bản chất của vectơ, và vị trí của x và y trong biểu thức. Ví dụ, nếu:

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

và mục tiêu chỉ là tìm các giá trị / ký tự duy nhất trong xđó không có trong yhoặc ngược lại. Áp dụng bất kỳ biểu thức nào sau đây sẽ vẫn cho câu trả lời đúng [1] 1:

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

Cảm ơn sự đóng góp của Jeromy Anglim

HOẶC LÀ:

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

Cảm ơn sự đóng góp của Workhouse

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.