我有一个关于在向量中查找索引值的问题。
让我们说我的矢量如下:
vector <- c(1,2,4,6,8,10)
并且,我们说我有价值&#39; 5&#39;。我想在&#34; vector&#34;中找到最大索引。它小于或等于值5.在上述例子的情况下,该指数为3(因为4小于或等于5)。同样,如果我有一个矢量,如:
vector <- c(1,2,4,5,6,8,10)
然后,如果我找到一个小于或等于5的值,那么这个索引现在是4而不是3。
但是,我还希望找到此索引发生的 first 和 last 时间。例如,如果我有一个矢量,如:
vector <- c(1,1,2,2,4,5,5,5,5,6,8,10)
然后第一次出现这个索引是6,这个索引最后一次出现的时间是9。
是否有一个简短的单行方法可以让我执行此任务?到目前为止,我一直在使用函数max(which(....)),但是我发现这个方法对于大型数据集效率非常低,因为它会逐字列出数百/数千个值,所以我想找到一个如果可能的话,更有效的方法可以适合一行。
提前致谢。
答案 0 :(得分:3)
您可以使用以下代码:
min(max(which(vector <= 5)), min(which(vector == 5)))
首先,它使用vector
函数搜索which
小于或等于5的所有索引,然后取最大值。
其次,它搜索vector
等于5并且取最小值的所有索引。
第三,它采用了这两个指数中的第一个
答案 1 :(得分:3)
感谢所有回复的人,我实际上通过下载包BBmisc
找到了一个非常简短的单行方法。它有一个名为which.last
和which.first
的函数,它们执行我需要的操作。再次感谢您花时间回复,我很感激。
答案 2 :(得分:2)
您可以使用:
my_ind <- function(vec, num){
ind <- which.max(vec == num) # Check for equality first
if(ind == 1L && vec[1L] != num){
ind <- which.min(vec < num) - 1L
}
ind
}
my_ind(c(1,2,4,6,8,10), 5L) # 3
my_ind(c(1,2,4,5,6,8,10), 5L) # 4
my_ind(c(1,1,2,2,4,5,5,5,5,6,8,10), 5L) # 6
my_ind(c(5,8,10), 5L) # 1
my_ind(c(6,8,10), 5L) # 0 - returns 0 if all(vec > 5L)
答案 3 :(得分:1)
我认为这里不需要包装。看起来构造which(x == max(x[x <= 5]))
对你有用。
x <- c(1, 2, 4, 6, 8, 10)
which(x == max(x[x <= 5]))
# [1] 3
x <- c(1, 2, 4, 5, 6, 8, 10)
which(x == max(x[x <= 5]))
# [1] 4
x <- c(1, 1, 2, 2, 4, 5, 5, 5, 5, 6, 8, 10)
which(x == max(x[x <= 5]))
# [1] 6 7 8 9
要查找倍数索引的最小/最大索引,请使用head/tail
。
head(which(x == max(x[x <= 5])), 1)
# [1] 6
tail(which(x == max(x[x <= 5])), 1)
# [1] 9