2011-08-31 46 views
5

Tôi có sắp xếp vectorVị trí trong vector dựa trên kết hợp xấp xỉ

m<-c(1.1, 3.2, 3.6, 4, 4.6, 4.6, 5.6, 5.7, 6.2, 8.9) 

tôi muốn tìm vị trí của một giá trị dựa trên kết hợp tương đối. Nếu giá trị không tồn tại trong vector tôi muốn vị trí của các giá trị ngay lập tức trước

cho phù hợp chính xác tôi sẽ sử dụng

> match(4,m) 
[1] 4 

Nhưng nếu tôi làm

> match(6,m) 
[1] NA 

gì tôi sẽ như để có được trong ví dụ này là 8 (vị trí của giá trị trước đó không xác định của 6 là vị trí của 5.7 là)

Cảm ơn bạn trước

+1

Bạn có muốn tìm chỉ mục cho một giá trị hoặc cho một vài giá trị không? Nếu bạn cần nhiều giá trị, hãy xem câu trả lời của tôi bên dưới về việc sử dụng 'findInterval'. – Tommy

+1

Tôi đồng ý, @ Câu trả lời của Tommy để sử dụng 'findInterval' là tốt nhất. – Andrie

Trả lời

3

Sử dụng which.max kết hợp với Subsetting vector, một giải pháp của 17 ký tự:

which.max(m[m<=6]) # Edited to specify <= 
[1] 8 

Kể từ vector của bạn được sắp xếp, bạn có thể sử dụng thậm chí ngắn hơn:

sum(m<=6) # Edited to specify <= 
[1] 8 

tác phẩm này bởi vì giá trị TRUE được chuyển đổi hoàn toàn thành 1 trong số sum

+0

Làm việc như một say mê. Nhanh như một viên đạn tăng tốc !!! Thankx – ECII

+1

@ECII Tôi vừa nhận thấy một lỗi nhỏ. Tôi nghĩ toán tử chính xác là '<=' thay vì '<' - nếu không nó sẽ không tìm thấy kết quả khớp chính xác. Vui lòng kiểm tra kết quả của riêng bạn. – Andrie

+0

Đừng lo lắng, đã thay đổi nó. Cảm ơn bạn một lần nữa – ECII

0

Cái gì như:

> m<-c(1.1, 3.2, 3.6, 4, 4.6, 4.6, 5.6, 5.7, 6.2, 8.9) 

> (index = length(m[m<=4])) 
[1] 4 

> (m[index]) 
[1] 4 

> (index = length(m[m<=6])) 
[1] 8 

> (m[index]) 
[1] 5.7 
+0

'm [index]' là một phần tử 'm', không phải là thứ mà OP muốn. –

+0

Mặc dù bạn đưa ra một điểm quan trọng là giải pháp dựa trên vectơ tốt hơn trong R so với vòng lặp. Lemme chỉnh sửa câu trả lời của tôi ... –

+0

@Jack Maney Tôi đã thêm một số đầu ra để làm cho nó rõ ràng hơn. Tôi nghĩ rằng đó là những gì OP muốn, nhưng sẽ rút câu trả lời nếu nó vẫn không chính xác (nó sớm và tôi có một nôn nao từ địa ngục): D –

1

bạn có thể sử dụng chức năng which() để có được những chỉ số của nguyên tố này với độ lệch nhỏ nhất từ ​​giá trị tìm kiếm của bạn. Cũng làm việc với các vector không theo thứ tự.

x <- c(8,4,1,2,3,6,9) 
find <- 6 
pos <- which(abs(x-find) == min(abs(x-find))) 
3

Điều này sẽ làm điều đó cho bạn.

#v is a sorted vector and x is an item for which we want the exact or nearest lower match 
lowSideMatch <- function(x, v) max(which(v <= x)) 

lowSideMatch(6, m) 
[1] 8 

lowSideMatch(4, m) 
[1] 4 
10

Có chức năng tích hợp chính xác những gì bạn muốn: findInterval ... Nó cũng được vector hóa, vì vậy bạn có thể cung cấp cho nó nhiều giá trị để tìm trong một lần hiệu quả hơn nhiều.

m <- c(1.1, 3.2, 3.6, 4, 4.6, 4.6, 5.6, 5.7, 6.2, 8.9) 
# Find nearest (lower) index for both 4 and 6 
findInterval(c(4,6), m) 
# [1] 4 8 
+1

+1 Brilliant. Tôi biết điều này đã tồn tại, nhưng chưa bao giờ có thể tìm thấy nó. Cảm ơn bạn. – Andrie

+0

@Andrie - Yeah, việc đặt tên cho hàm R không phải lúc nào cũng rõ ràng! – Tommy

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