Получить минимальное значение одной переменной больше, чем наблюдение другой переменной - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть два разных набора данных (или вектора).Допустим, в одном у меня есть эта переменная с несколькими наблюдениями:

a<- c(1:30)

Затем в другом наборе данных у меня есть еще одна (гораздо меньшая переменная) с, скажем, только 5 наблюдениями.

ref <- c(5:10)

Я хочу создать переменную, которая содержит минимальное значение ref среди тех, которые больше (или равны), чем a, для каждого a или иначе выдают 0. Я пробовал это, но, очевидно, не работает.

min <- ifelse(a>=ref, min(ref[a>=ref]), 0)

Итоговая переменная должна иметь ту же длину, что и a, и быть 0, когда a находится в диапазоне от 1 до 4, 5 для 5, 6 для 6 ... и 10 для всех значений 10 или выше.

Спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Мы можем попробовать

replace(findInterval(a, ref) + min(ref) - 1, a <= min(ref), 0) 
[#1]  0  0  0  0  0  6  7  8  9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10

Или другой вариант pmin/pmax

out <- pmin(a, max(ref))
out[out < min(ref)] <- 0

, который также можно записать в одну строку с

pmin(a, max(ref)) * (a >= min(ref))
0 голосов
/ 10 декабря 2018

Для каждого значения a мы находим ближайшее значение ref, которое больше или равно a, если оно присутствует, или возвращает 0.

sapply(a, function(x) ifelse(any(x >= ref), max(ref[which(x >= ref)]), 0))
#[1]  0  0  0  0  5  6  7  8  9 10 10 10 10 10 10 10 10 10 10.......

Как предлагает @Sotos, мы можем использовать вложенные replace или ifelse, чтобы сделать то же самое без циклов

#Option 1
replace(replace(a, a < min(ref), 0), a > max(ref), max(ref))

#Option 2
ifelse(a < min(ref), 0, ifelse(a > max(ref), max(ref), a))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...