Возврат вектора позиций с использованием which.max - PullRequest
0 голосов
/ 13 сентября 2018
  x <- seq(1:100)
  y <- 30

Если я хочу определить место, в котором накопленная сумма x> y

  which.max(cumsum(x) >= y)
  [1] 9 # 

Вместо этого, если у - вектор, т. Е. Я хочу вернуться для каждого элемента у, позиция х

  y <- c(30, 60, 80, 90)
  which.max(cumsum(x) >= y)
  [1] 9

Почему он не перенастраивает вектор позиций?

Ответы [ 3 ]

0 голосов
/ 13 сентября 2018

Другая векторизованная идея - использовать max.col с outer, т.е.

max.col(t(outer(cumsum(x), y, `>`)), 'first')
#[1]  8 11 13 13
0 голосов
/ 13 сентября 2018

Это решение подходит?

sapply(y, function(i) which.max(cumsum(x) >= i)) 
0 голосов
/ 13 сентября 2018

Краткий ответ: потому что он не векторизован по 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 дает вам позицию, в которой ваше значение в последний раз равно или больше, чем.

...