2009-07-23 24 views
363

Trong R, làm cách nào bạn kiểm tra một vectơ để xem nó có chứa một phần tử đã cho không?kiểm tra nếu một vector chứa một phần tử đã cho

+28

đôi khi tôi tự hỏi tại sao R chỉ không sử dụng từ chứa để làm cho nó dễ dàng hơn người dùng – greg121

+8

xem xét rằng "trong" được chứa trong "chứa đựng"; Tôi cho rằng "trong" là một ứng cử viên ngắn gọn đáng kể trong bối cảnh này – hedgedandlevered

+1

Có lẽ với việc bổ sung thêm các '%' -giá trị. Từ 'in' là một từ dành riêng trong R sử dụng trong xây dựng vòng lặp. –

Trả lời

373

Cả hai match() (trả về hình thức đầu tiên) và %in% (trả về một hàm Boolean) được thiết kế cho việc này.

v <- c('a','b','c','e') 

'b' %in% v 
## returns TRUE 

match('b',v) 
## returns the first location of 'b', in this case: 2 
31

Bạn có thể sử dụng %in% điều hành:

vec <- c(1, 2, 3, 4, 5) 
1 %in% veC# true 
10 %in% veC# false 
54

Các bất kỳ() chức năng làm cho mã dễ đọc

> w <- c(1,2,3) 
> any(w==1) 
[1] TRUE 

> v <- c('a','b','c') 
> any(v=='b') 
[1] TRUE 

> any(v=='f') 
[1] FALSE 
+4

Hãy nhận biết hành vi này khác với '% trong%': 'bất kỳ (1 == NA)' trả về 'NA', trong đó' 1% trong% NA' trả về 'FALSE'. – dash2

15

Cũng để tìm vị trí của phần tử "mà" có thể được sử dụng làm

pop <- c(3,4,5,7,13) 

which(pop==13) 

và để tìm các yếu tố mà không được chứa trong vector mục tiêu, người ta có thể làm điều này:

pop <- c(1,2,4,6,10) 

Tset <- c(2,10,7) # Target set 

pop[which(!(pop%in%Tset))] 
+0

'mà' thực sự là thích hợp hơn đôi khi nó cho bạn * tất cả * các vị trí phù hợp (như một mảng), không giống như' match'. Mặc dù điều này có lẽ không phải là những gì OP yêu cầu, không giống như http://stackoverflow.com/questions/1169388/finding-multiple-elements-in-a-vector – Fizz

+0

Tại sao bận tâm với 'which' nếu bạn chỉ muốn tìm các phần tử không có trong 'Tset'? Bạn chỉ có thể lập chỉ mục 'pop' trực tiếp; 'pop [! pop% in% Tset]' – Houshalter

136

is.element() làm cho mã dễ đọc hơn, và giống hệt %in%

v <- c('a','b','c','e') 

is.element('b', v) 
'b' %in% v 
## both return TRUE 

is.element('f', v) 
'f' %in% v 
## both return FALSE 

subv <- c('a', 'f') 
subv %in% v 
## returns a vector TRUE FALSE 
is.element(subv, v) 
## returns a vector TRUE FALSE 
+5

Tôi biết tài liệu nói 'is.element (x, y) giống hệt với x% trong% y'. Nhưng, tôi không biết tại sao, 'is.elements' hoạt động khi trộn các số nguyên và số và'% trong% 'không – pomber

+0

@pomber: Bạn có thể đưa ra ví dụ về điều này không? – discipulus

8

Tôi thực sự như grep() và grepl() cho mục đích này.

grep() trả về một vectơ các số nguyên, cho biết vị trí phù hợp.

yo <- c("a", "a", "b", "b", "c", "c") 

grep("b", yo) 
[1] 3 4 

grepl() trả về một vector logic, với "TRUE" tại vị trí của trận đấu.

yo <- c("a", "a", "b", "b", "c", "c") 

grepl("b", yo) 
[1] FALSE FALSE TRUE TRUE FALSE FALSE 

Các chức năng này phân biệt chữ hoa chữ thường.

+8

Theo mặc định, 'grep' có biểu thức chính quy làm phần tử đầu tiên, do đó, để so khớp chính xác cho' "b" ', hoặc dùng'^e $ 'hoặc thêm', cố định = TRUE'). – reinierpost

+8

Không sử dụng regex để đối sánh chính xác. Điều này là nguy hiểm và có thể có kết quả bất ngờ –

+8

Vâng, đây là một ý tưởng khủng khiếp, không tốt, rất xấu - không hiệu quả và được bảo đảm để phá vỡ. Ví dụ. 'myvar <- 'blah'; grepl ('b', myvar, fixed = TRUE) 'sẽ trả về' TRUE' mặc dù 'b' không nằm trong 'myvar'. – dash2

15

Tôi sẽ nhóm các tùy chọn dựa trên đầu ra. Giả sử vectơ sau cho tất cả các ví dụ.

v <- c('z', 'a','b','a','e') 

Để kiểm tra sự hiện diện của:

% trong%

> 'a' %in% v 
[1] TRUE 

bất kỳ()

> any('a'==v) 
[1] TRUE 

là.yếu tố()

> is.element('a', v) 
[1] TRUE 

Đối với việc tìm kiếm sự xuất hiện đầu tiên:

trận()

> match('a', v) 
[1] 2 

Đối với việc tìm kiếm tất cả các lần xuất hiện như vector của chỉ số:

mà()

> which('a' == v) 
[1] 2 4 

Đối với việc tìm kiếm tất cả các lần xuất hiện như logic vector:

==

> 'a' == v 
[1] FALSE TRUE FALSE TRUE FALSE 

Edit: Loại bỏ grep()grepl() khỏi danh sách vì lý do nêu trong ý kiến ​​

+5

Như đã nhận xét [ở đây] (https://stackoverflow.com/questions/1169248/r-function-for-testing-if-a-vector-contains-a-given-element/34056066#comment66181358_34056066) và [tại đây] (https://stackoverflow.com/questions/1169248/r-function-for-testing-if-a-vector-contains-a-given-element/34056066#comment73025314_34056066), không sử dụng 'grep()' hoặc biểu thức chính quy để tìm kết quả khớp chính xác. – Uwe

Các vấn đề liên quan