цикл for: записи в векторе A должны быть заменены записями в векторе B - PullRequest
2 голосов
/ 09 апреля 2019

Я сократил проблему до небольшого примера.Я надеюсь, что это полезно и понятно.

Даны два вектора A и B. Записи в векторе A должны быть заменены на записи в векторе B. Замена должна быть сделана с абсолютной минимальной разностьюзаписи.После замены всех записей в векторе A новый вектор должен быть сохранен.Может быть, цикл for - это хорошая идея? (Также для больших векторов?) Большое спасибо за вашу помощь!

Например:

A <- c(1.2, 1.3, 1.3, 1.4, 1.5) 

B <- c(1.25, 1.45)

цикл for должен работатькак это:

1,2 - 1,25 = 0,05

1,2 - 1,45 = 0,25

и т. Д.

0.05 - абсолютный минимум, заменив 1.2 на 1.25

Новый вектор должен выглядеть следующим образом:

newVector <- c(1.25, 1.25, 1.25, 1.45, 1.45)

Ответы [ 3 ]

1 голос
/ 09 апреля 2019

Еще одна идея, использующая outer и max.col

B[max.col(-abs(outer(A, B, `-`)))]
# [1] 1.25 1.25 1.25 1.45 1.45

Хорошо подойдет, если A и B не слишком велики.

шагшагом

outer(A, B, "-") возвращает следующую матрицу

#      [,1]  [,2]
#[1,] -0.05 -0.25
#[2,]  0.05 -0.15
#[3,]  0.05 -0.15
#[4,]  0.15 -0.05
#[5,]  0.25  0.05 

, где первый столбец является результатом A - B[1], а второй столбец - A - B[2].Для каждой строки нам нужно найти положение столбца абсолютного минимума.

Нет функции min.col, поэтому минус в

max.col(-abs(outer(A, B, `-`)))

, который возвращает

# [1] 1 1 1 2 2

Наконец, мы используем этот вектор для извлечения нужных значений из B.

1 голос
/ 09 апреля 2019

С sapply это легко сделать без for петли:

newVector <- sapply(A,function(x) B[which.min(abs(x-B))])
0 голосов
/ 09 апреля 2019

Сначала получите индекс минимальной разности всех элементов A с B:

(ind <- sapply(A, function(a) which.min(abs(B - a))))
# [1] 1 1 1 2 2

Затем замените значения на соответствующие значения в B:

B[ind]
# [1] 1.25 1.25 1.25 1.45 1.45

Эта форма для иллюстративных целей.Короткий код будет выглядеть следующим образом:

sapply(A, function(a) B[which.min(abs(B - a))])
# [1] 1.25 1.25 1.25 1.45 1.45
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...