我有一个长度为N
的向量,并且在该向量中有一个随机索引ind
。
我想以最对称的方式,以最有效的方式将11个最接近的索引提取到ind
,例如不要超出原始向量的长度,也不要获取负索引。 / p>
示例:
如果N = 200
和ind = 199
,我想提取190:200。
如果ind = 3
,则结果应为1:11。
如果ind = 195
,则结果应为190:200。
我可以使用if
来做到这一点,但效率似乎很低:
ff = function(ind, N){
vv = sapply(ind, function(x) c((x-5):(x+5)))
if (max(vv) > N) {
vv = vv - max(vv) + N
} else if (min(vv) < 6) {
vv = vv - min(vv) + 1
}
return(vv)
}
是否有更有效的方法(例如子设置)来做到这一点?
答案 0 :(得分:2)
以下是几种方法:
1)使用order
sort(head(order(abs(1:N - ind)), 11L))
2)对索引和ind
之间的绝对差进行排序,然后获得前11个位置
sort((1:N)[as.integer(names(head(sort(abs(setNames(1:N, 1:N) - ind)), 11L)))])
3)使用基数排序:
sort(head(sort(abs(1:N - ind), index.return=TRUE)$ix, 11L))