从向量中删除n个最小的元素,包括重复元素

时间:2018-06-24 14:33:13

标签: r sorting rank

我有以下向量:

v = c(1,2,3,1,3,2,3,4,3,3,1, 5, 5,2)

我想获取向量

v_new = c(3,3,2,3,4,3,3,5,2,2)

我从中删除了第一个最小的元素1、1、1、2。请不要让我不想删除其他出现的数字2。函数order几乎给了我什么需要,但它的输出很奇怪,因为它注意v [order(v)]给出元素的顺序递增,而不给出元素的等级。 rank还提供了一些奇怪的地方:

v[rank(v)]
 [1] 2 3 3 2 3 3 3 5 3 3 2 5 5 3

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:3)

order是您所需要的,但是要使其正常工作,您需要负索引。 order本身返回将对输入向量进行排序的一组索引:

v = c(1,2,3,1,3,2,3,4,3,3,1,5,5,2)

order(v)
#>  [1]  1  4 11  2  6 14  3  5  7  9 10  8 12 13

v[order(v)]
#>  [1] 1 1 1 2 2 2 3 3 3 3 3 4 5 5

您可以使用负索引从向量中删除元素:

(5:1)[c(-1, -2)]
#> [1] 3 2 1

将两者放在一起,以从向量中删除最小的元素,取反order的结果的前n个元素:

v[-order(v)[1:4]]
#>  [1] 3 3 2 3 4 3 3 5 5 2

请注意,order从前面索引了绑定的元素,这就是为什么前2个元素被删除的原因。