使用 which.max 返回位置向量
Returning a vector of positions using which.max
x <- seq(1:100)
y <- 30
如果我想确定x > y的累加和所在的位置
which.max(cumsum(x) >= y)
[1] 9 #
相反,如果 y 是一个向量,即我想 return 每个元素
y, x
的位置
y <- c(30, 60, 80, 90)
which.max(cumsum(x) >= y)
[1] 9
为什么不重新调整位置向量?
简短回答:因为它没有在 y 中矢量化并且 which.max
不 return 超过 1 个值。
长答案:
which.max
仅 return 是长度为 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
为您提供了您的值最后等于或大于的位置。
另一个向量化的想法是使用 max.col
和 outer
,即
max.col(t(outer(cumsum(x), y, `>`)), 'first')
#[1] 8 11 13 13
这个解决方案合适吗?
sapply(y, function(i) which.max(cumsum(x) >= i))
x <- seq(1:100)
y <- 30
如果我想确定x > y的累加和所在的位置
which.max(cumsum(x) >= y)
[1] 9 #
相反,如果 y 是一个向量,即我想 return 每个元素 y, x
的位置 y <- c(30, 60, 80, 90)
which.max(cumsum(x) >= y)
[1] 9
为什么不重新调整位置向量?
简短回答:因为它没有在 y 中矢量化并且 which.max
不 return 超过 1 个值。
长答案:
which.max
仅 return 是长度为 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
为您提供了您的值最后等于或大于的位置。
另一个向量化的想法是使用 max.col
和 outer
,即
max.col(t(outer(cumsum(x), y, `>`)), 'first')
#[1] 8 11 13 13
这个解决方案合适吗?
sapply(y, function(i) which.max(cumsum(x) >= i))