Làm thế nào để kiểm tra nếu một vectơ chứa một giá trị nhất định?
%
- đó là. Từ in
này là một từ dành riêng trong R sử dụng trong xây dựng vòng lặp for.
select(iris, contains("etal"))
.
Làm thế nào để kiểm tra nếu một vectơ chứa một giá trị nhất định?
%
- đó là. Từ in
này là một từ dành riêng trong R sử dụng trong xây dựng vòng lặp for.
select(iris, contains("etal"))
.
Câu trả lời:
Cả hai hàm match()
(trả về lần xuất hiện đầu tiên) và %in%
(trả về hàm Boolean) đều đượ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
which(v, 'b')
. Tâm trí thứ tự của các cuộc tranh luận.
which(v, 'b')
đưa cho tôi một thông báo lỗi:> Lỗi trong đó (v, 'b'): đối số với 'which' không logic
is.element()
làm cho mã dễ đọc hơn và giống hệt với mã %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
is.element(x, y) is identical to x %in% y
. Nhưng, tôi không biết tại sao, is.elements
hoạt động khi trộn số nguyên và số và %in%
không
is.element()
so với %in%
chủ quan. Một trường hợp có thể được thực hiện rằng một toán tử infix dễ đọc hơn bởi vì nó loại bỏ sự mơ hồ theo thứ tự các đối số. apple in fruit
có ý nghĩa, fruit in apple
không. is.element(apple, fruit)
hoặc is.element(fruit, apple)
cả hai có thể đúng tùy thuộc vào việc thực hiện is.element
chức năng.
Tôi sẽ nhóm các tùy chọn dựa trên đầu ra. Giả sử các 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:
%trong%
> 'a' %in% v
[1] TRUE
bất kì()
> any('a'==v)
[1] TRUE
is.element ()
> 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 đấu()
> match('a', v)
[1] 2
Để tìm tất cả các lần xuất hiện dưới dạng vectơ của các chỉ số:
mà ()
> which('a' == v)
[1] 2 4
Để tìm tất cả các lần xuất hiện dưới dạng vector logic :
==
> 'a' == v
[1] FALSE TRUE FALSE TRUE FALSE
Chỉnh sửa: Xóa grep () và grepl () khỏi danh sách vì lý do được đề cập trong các nhận xét
Hàm any () làm cho mã có thể đọc đượ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
any(1==NA, na.rm=TRUE)
trả lại FALSE
.
Ngoài ra để tìm vị trí của phần tử "mà" có thể được sử dụng như
pop <- c(3,4,5,7,13)
which(pop==13)
và để tìm các phần tử không có trong vectơ đích, 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))]
which
đôi khi thực sự thích hợp hơn vì nó cung cấp cho bạn tất cả các vị trí phù hợp (dưới dạng một mảng), không giống như match
. Mặc dù đây có lẽ không phải là những gì OP yêu cầu, không giống như stackoverflow.com/questions/1169388/NH
which
nếu bạn chỉ muốn tìm các yếu tố không trong Tset
? Bạn chỉ có thể lập chỉ mục pop
trực tiếp; pop[!pop%in%Tset]
Tôi thực sự thích grep () và grepl () cho mục đích này.
grep () trả về một vectơ số nguyên, cho biết vị trí khớp.
yo <- c("a", "a", "b", "b", "c", "c")
grep("b", yo)
[1] 3 4
grepl () trả về một vectơ logic, với "TRUE" tại vị trí khớp.
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 là trường hợp nhạy cảm.
grep
lấy một biểu thức chính quy làm thành phần đầu tiên của nó, do đó, để thực hiện khớp chính xác cho "b"
, sử dụng ^e$
hoặc thêm , fixed=TRUE
).