Краткий ответ: потому что он не векторизован по y, а which.max
не возвращает более 1 значения.
Длинный ответ:
which.max
возвращает только целое число длины 1 или 0. Это работает в вашем первом случае, потому что вы ищете только одно значение.
Кроме того, рециркуляция векторов происходит при сравнении векторов разной длины. Опять же, в первом случае это просто, так как вектор длины 1 будет переработан и соответствует каждому элементу более длинного вектора. Однако, когда меньший вектор имеет несколько элементов, вы можете получить несоответствие того, что ожидаете, например:
c(1,1,1,1) >= 1
[1] TRUE TRUE TRUE TRUE
c(1,1,1,1) >= c(1,2)
[1] TRUE FALSE TRUE FALSE
Вам нужно либо зациклить на y, либо использовать findInterval
:
findInterval(y,cumsum(x))+1
[1] 8 11 13 13
Вы добавляете 1, потому что findInterval
дает вам позицию, в которой ваше значение в последний раз равно или больше, чем.