Название не делает этого вопроса справедливым, но я не мог придумать другого способа формулировать вопрос. Я могу лучше всего объяснить проблему на примере.Соответствующие номера по их порядку, когда в двух разных векторах
Допустим, у нас есть два вектора чисел (каждое из которых всегда будет возноситься и уникальным):
vector1 <- c(1,3,10,11,24,26,30,31)
vector2 <- c(5,9,15,19,21,23,28,35)
То, что я пытаюсь сделать, это создать функцию, которая будет принимать эти два вектора и сопоставить их следующим образом:
1) Начните с первым элементом Vector1 (в данном случае 1)
2) Перейти к Vector2 и соответствует элементу из # 1 с первым элементом в векторе- что больше его (в данном случае 5)
3) Вернитесь к Vector1 и пропустить все элементы меньше, чем значение в # 2 мы нашли (в данном случае, мы пропускаем 3, и захватить 10)
4) Вернитесь к Vector2 и пропустить все элементы меньше, чем значение в № 3, которое мы нашли (в этом случае мы пропускаем 9 и захватываем 15)
5) повторяем, пока мы не закончим со всеми элементами.
Полученные в результате двух векторов мы должны иметь являются:
result1 = c(1,10,24,30)
result2 = c(5,15,28,35)
Мое текущее решение идет что-то вроде этого, но я считаю, что это может быть крайне неэффективно:
# establishes where we start from the vector2 numbers
# just in case we have vector1 <- c(5,8,10)
# and vector2 <- c(1,2,3,4,6,7). We would want to skip the 1,2,3,4 values
i <- 1
while(vector2[i]<vector1[1]){
i <- i+1
}
# starts the result1 vector with the first value from the vector1
result1 <- vector1[1]
# starts the result2 vector empty and will add as we loop through
result2 <- c()
# super complicated and probably hugely inefficient loop within a loop within a loop
# i really want to avoid doing this, but I cannot think of any other way to accomplish this
for(j in 1:length(vector1)){
while(vector1[j] > vector2[i] && (i+1) <= length(vector2)){
result1 <- c(result1,vector1[j])
result2 <- c(result2,vector2[i])
while(vector1[j] > vector2[i+1] && (i+2) <= length(vector2)){
i <- i+1
}
i <- i+1
}
}
## have to add on the last vector2 value cause while loop skips it
## if it doesn't exist (there are no more vector2 values bigger) we put in an NA
if(result1[length(result1)] < vector2[i]){
result2 <- c(result2,vector2[i])
}
else{
### we ran out of vector2 values that are bigger
result2 <- c(result2,NA)
}
что такое умное решение. Я никогда не думал о чередовании двух векторов (я полагаю, я не сделал все возможное из моих предположений о восходящей и уникальности). Я только что изменил последнюю строку кода и заставил ее работать. Спасибо огромное! –
жаль беспокоить, но я заметил ошибку при попытке сравнить ее с моим предыдущим решением. Если значения vector1 начинают превышать значения vector2, выход неверен. Например, vector1 = (3,10, ...) и vector2 являются (1,5,9 ...) Я исправил это, просто изменив vector2, чтобы удалить любые значения, которые ниже начального значения vector1 –
can вы просто используете vector2 как вектор 1 и наоборот? то есть всегда использовать сначала вектор с наименьшим первым элементом? – rawr