找到最小正值

时间:2015-05-26 20:20:19

标签: r

我想我不知道which.min以及我的想法。

我试图在最小值为正的矢量中找到该事件。

TIME <- c(0.00000,  4.47104,  6.10598,  6.73993,  8.17467,  8.80862, 10.00980, 11.01080, 14.78110, 15.51520, 16.51620, 17.11680)

我想知道1到19的值z,上面的矢量TIME的索引包含最接近但高于z的值。我尝试了以下代码:

vec <- sapply(seq(1,19,1), function(z) which.min((z-TIME > 0)))
vec 

#[1] 2  2  2  2  3  3  5  5  7  7  8  9  9  9 10 11 12  1  1

在我看来,vec的最后两个值应该是'12,12'。这样做的原因是它认为'0.0000'最接近0。

所以,我想也许是因为我从外部软件导出数据而且0.0000实际上不是0.但是,

TIME[1]==0  #TRUE

然后我更加困惑。为什么这些给出了索引1的答案,何时真的应该是错误?

which.min(0 > 0 ) #1
which.min(-1 > 0 ) #1

我会很高兴被纠正。

编辑:

我想简而言之,获得此结果的更好方法是什么:

#[1] 2  2  2  2  3  3  5  5  7  7  8  9  9  9 10 11 12  12  12

显示从1到19的值减去TIME的每个元素时,给出最小可能正值的TIME索引。

2 个答案:

答案 0 :(得分:4)

此处使用的自然功能(限制输入和效率)实际上不是which.min + sapply,而是cut功能,它将确定每个功能的时间范围值1:19落入:

cut(1:19, breaks=TIME, right=FALSE)
# [1] [0,4.47)    [0,4.47)    [0,4.47)    [0,4.47)    [4.47,6.11) [4.47,6.11) [6.74,8.17)
# [8] [6.74,8.17) [8.81,10)   [8.81,10)   [10,11)     [11,14.8)   [11,14.8)   [11,14.8)  
# [15] [14.8,15.5) [15.5,16.5) [16.5,17.1) <NA>        <NA>       
# 11 Levels: [0,4.47) [4.47,6.11) [6.11,6.74) [6.74,8.17) [8.17,8.81) ... [16.5,17.1)

由此,您可以轻松确定您要查找的内容,这是TIME中最小元素的索引,大于截止值:

(x <- as.numeric(cut(1:19, breaks=TIME, right=FALSE))+1)
# [1]  2  2  2  2  3  3  5  5  7  7  8  9  9  9 10 11 12 NA NA

最后两个条目显示为NA,因为TIME中没有超过18或19的元素。如果要将这些元素替换为TIME中的最大元素,则可以使用replace {1}}:

replace(x, is.na(x), length(TIME))
# [1]  2  2  2  2  3  3  5  5  7  7  8  9  9  9 10 11 12 12 12

答案 1 :(得分:3)

这是一种方式:

x <- t(outer(TIME,1:19,`-`))            
max.col(ifelse(x<0,x,Inf),ties="first")
#  [1]  2  2  2  2  3  3  5  5  7  7  8  9  9  9 10 11 12 12 12

以这种方式消除所有差异在计算上是浪费的,因为两个向量都是有序的。