2015-07-08 3 views
2

У меня есть два вектора, скажем:R: соответствуют одинаковые значения

A <- c(13.25, 14.24, 15.29, 16.27, 17.31) 

и

B <- c(10.1, 11.2, 12.1, 13.2, 14.1, 15.3, 16.2, 17.4, 18.3, ...) 

, и я хотел бы «матч» значения первого ко второму, получение позиции аналогичных значений. В этом случае я хотел бы получить

C <- c(4, 5, 6, 7, 8) 

Я пробовал матч, но он не работает. Кроме того, я пробовал сопоставление, применяемое к округлым векторам, но проблема в том, что он не всегда работает: если B содержит 14.48, а C содержит 14.51, они округляются до 14 и 15 соответственно ...

+1

Какова ваша толерантность к «похожей»? – nrussell

+0

Вы хотите, чтобы значения 'A' соответствовали самому близкому значению« B »? –

+0

Допуск 0,2 – Ruggero

ответ

4

Если вы хотите, чтобы ближайшего значения B быть согласованы, то вы можете использовать which.min с абсолютным расстоянием от каждого элемента A:

C <- sapply(A, function(x) which.min(abs(x-B))) 
C 
[1] 4 5 6 7 8 

Обновлено

с толерантностью, вы должны добавить дополнительный шаг, чтобы исключить результаты за пределами диапазона:

tolerance <- 0.2 
in_range <- unlist(sapply(A, function(x) x[any(abs(x-B) < tolerance)])) 
C <- sapply(A, function(x) which.min(abs(x-B))) 
C <- C[match(in_range, A)] 
0

Я не знаю, какой округление вы хотите, с помощью вы можете искать trunc, который возвращает целые числа. Что касается функции, попробуйте

which(trunc(B) %in% trunc(A)) 
# [1] 4 5 6 7 8 
Смежные вопросы