我想我不知道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索引。
答案 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
以这种方式消除所有差异在计算上是浪费的,因为两个向量都是有序的。